Plan Limits
Quota and feature matrix per plan, how API keys enforce plan limits, overage billing, and checking current usage
Plan Limits
Every API call respects the same plan limits as the dashboard UI. Limits are enforced before the operation is performed — exceeding a quota or accessing a gated feature returns an error immediately. There is no silent over-delivery.
Plans
| Free | Pro | Max | Enterprise | |
|---|---|---|---|---|
| Price | Free | $24.99/mo | $99.99/mo | Custom |
Email Send Quotas
| Quota | Free | Pro | Max | Enterprise |
|---|---|---|---|---|
| Emails / day | 500 | 10,000 | 50,000 | Unlimited |
| Emails / month | 15,000 | 300,000 | 1,500,000 | Unlimited |
Both limits are enforced atomically via the check_and_increment_email_usage database function. Exceeding either returns 429. The stricter of the two limits (day vs. month) is always applied.
Feature Quotas
| Feature | Free | Pro | Max | Enterprise |
|---|---|---|---|---|
| Contacts | 1,000 | Unlimited | Unlimited | Unlimited |
| Campaigns / month | 3 | Unlimited | Unlimited | Unlimited |
| Templates | 5 | Unlimited | Unlimited | Unlimited |
| Automations | 2 | 20 | Unlimited | Unlimited |
| Connected inboxes | 1 | Unlimited | Unlimited | Unlimited |
| Forms | 1 | 10 | Unlimited | Unlimited |
| Landing pages | 0 | 5 | Unlimited | Unlimited |
| Custom domains | 0 | Unlimited | Unlimited | Unlimited |
| API keys | 1 | 5 | Unlimited | Unlimited |
| A/B test variants | 0 | 2 | 5 | Unlimited |
| AI generations / month | 0 | 100 | 1,000 | Unlimited |
| Email validations / month | 0 | 1,000 | 10,000 | Unlimited |
| Saved analytics reports | 0 | 5 | Unlimited | Unlimited |
| Monitored DMARC domains | 0 | 0 | 10 | Unlimited |
| Dedicated IPs | 0 | 0 | 1 | 5 |
Feature Flags
Some features are binary — either enabled or disabled for the plan, regardless of count.
| Feature | Free | Pro | Max | Enterprise |
|---|---|---|---|---|
| Bulk contact import | ✗ | ✓ | ✓ | ✓ |
| AI features (subject lines, autopilot, reply assist) | ✗ | ✓ | ✓ | ✓ |
| Custom SMTP / SMTP pools | ✗ | ✗ | ✓ | ✓ |
| Lead Finder & pipeline | ✗ | ✓ | ✓ | ✓ |
| WhatsApp messaging | ✗ | ✗ | ✓ | ✓ |
| Push notifications | ✗ | ✗ | ✓ | ✓ |
| Ecommerce / purchase tracking | ✗ | ✗ | ✓ | ✓ |
| Advanced revenue attribution | ✗ | ✗ | ✓ | ✓ |
| Newsletter monetization | ✗ | ✗ | ✓ | ✓ |
| Analytics export | ✗ | ✗ | ✓ | ✓ |
| Scheduled analytics reports | ✗ | ✗ | ✓ | ✓ |
| Custom contact scoring rules | ✗ | ✗ | ✓ | ✓ |
| White-label client reports | ✗ | ✗ | ✓ | ✓ |
| Multi-workspace & SSO/SAML | ✗ | ✗ | ✓ | ✓ |
| Full API access & webhooks | ✗ | ✓ | ✓ | ✓ |
| Analytics retention | 30 days | 90 days | 365 days | Unlimited |
How Plan Limits Are Enforced
When an API key makes a request, the server resolves the key → user → active subscription → plan chain:
msk_xxx → user_id → user_subscriptions (status: active|trialing)
→ subscription_plans (quotas + feature flags)Two enforcement paths:
1. Feature checks (checkPlanLimit RPC) — for creating resources (contacts, campaigns, templates, etc.). Returns 403 if the user is at or over their plan's limit.
2. Atomic send quota (check_and_increment_email_usage RPC) — for POST /v1/send. Atomically checks and increments the daily and monthly send counter in a single DB transaction to prevent TOCTOU races under concurrent sends. Returns 429 if either limit is reached.
Plan limits are evaluated at request time against the currently active subscription. Upgrades take effect immediately — no need to re-create API keys.
Overage Billing
When Allow Overage is enabled in Settings → Billing, usage beyond the plan limit is billed at the end of the billing cycle instead of being blocked. Overage is opt-in and disabled by default.
| Feature | Overage rate |
|---|---|
| Emails (beyond quota) | $0.002 / email |
| Email validations | $0.01 / validation |
When overage is disabled (default), requests that exceed the limit are rejected with 429 and no partial work is done.
Checking Current Usage
GET /api/v1/usage
Returns the current period's usage against plan limits. Requires session auth or an API key with the read scope.
curl https://mail.misar.io/api/v1/usage \
-H "Authorization: Bearer msk_YOUR_API_KEY"Response
{
"success": true,
"plan": "pro",
"billing_period": {
"start": "2026-04-01T00:00:00Z",
"end": "2026-04-30T23:59:59Z"
},
"usage": {
"emails_sent_today": 1240,
"emails_sent_month": 18400,
"contacts": 3102,
"campaigns": 7,
"automations": 3,
"ai_generations": 44,
"email_validations": 210,
"custom_domains": 2,
"dedicated_ips": 0
},
"limits": {
"emails_per_day": 10000,
"emails_per_month": 300000,
"contacts": null,
"campaigns": null,
"automations": 20,
"ai_generations": 100,
"email_validations": 1000,
"custom_domains": null,
"dedicated_ips": 0
},
"features": {
"bulk_import": true,
"ai_features": true,
"custom_smtp": false,
"whatsapp": false,
"push": false
},
"overage_enabled": false
}null in limits means unlimited for the current plan.
Limit Enforcement Error Responses
403 — Feature limit reached (resource quota)
{
"success": false,
"error": "Automation limit reached (20 / 20). Upgrade to Max for unlimited automations.",
"feature": "automations",
"current": 20,
"limit": 20,
"required_plan": "max"
}403 — Feature not available on plan
{
"success": false,
"error": "WhatsApp messaging requires the Max plan.",
"feature": "whatsapp",
"current": 0,
"limit": 0,
"required_plan": "max"
}429 — Send quota exceeded
{
"success": false,
"error": "Send limit reached. Upgrade at mail.misar.io/pricing",
"feature": "emails_per_month",
"current": 300000,
"limit": 300000,
"retry_after": "2026-05-01T00:00:00Z"
}Upgrading
Visit mail.misar.io/pricing to upgrade. Changes take effect immediately at the API layer — no key rotation needed.