Limits
Plan caps are enforced. There is no separate daily cap.
Full prices are on /pricing. Over a cap, the API returns HTTP 402 plan_limit_exceeded with upgrade_url.
| Plan | Inboxes | Emails / month | Custom domains |
|---|---|---|---|
| Free ($0) | 5 | 5,000 | 1 |
| Starter ($12/mo) | 25 | 25,000 | 15 |
| Pro ($99/mo) | 300 | 250,000 | 200 |
One outbound API send counts as one email, regardless of recipient count. Replaying the same client_id does not count again. Inbound mail does not count against the send cap.
Starter and Pro raise a cap with POST /api/v1/billing/addons. {"inboxes":N} is $1 per extra inbox each month. {"domains":N} is $1 per extra domain each month. {"email_packs":N} is $1 per 1,000 emails each month. N replaces the previous quantity, from 0 to 100. An increase is invoiced immediately, and the cap rises only after Stripe confirms payment. A decrease is not credited and cannot drop below live usage. The MCP tool is cooper_set_addons. Free cannot buy these and stays at the included cap. The API does not meter past the cap on its own.
Accounts already in the database when the billing columns were added are grandfathered and are not subject to these inbox or send caps. New accounts start on Free.
Attachments: 10 files, 4 MiB each, 5 MiB total message (Cloudflare Email Sending limit). Cooper does not publish a separate requests-per-minute API throttle. Abusive traffic is handled under the abuse policy. Vercel and Cloudflare may apply their own edge limits. Event consumers use that same rule. GET /api/v1/event-consumers/{id}/events waits at most 25 seconds, the same cap as GET /api/v1/events.
An account can store at most 50 durable event consumers. The next create returns HTTP 409 consumer_limit. That cap is a technical limit, not a plan limit, and it does not change Free, Starter, or Pro. The event log is kept for 7 days. An event an active consumer has not committed, and that matches that consumer's inbox and types, is kept for up to 90 days. A consumer with no create, poll, or commit for 90 days does not extend retention and is not deleted. Nothing is kept longer than 90 days. events_may_have_expired is true when the committed cursor is older than the events that consumer was guaranteed to keep. The guide is /docs/event-consumers.
A thread assignee is 1–64 characters: letters, digits, and . _ @ + : -. A note is at most 500 characters. lease_seconds is an integer from 30 to 86400. Those bounds are technical limits on the assignment row. They do not change Free, Starter, or Pro. The guide is /docs/thread-assignment.
POST /api/v1/inboxes/{id}/threads/move accepts at most 100 thread ids. Trash is kept for 30 days. The daily cron purges at most 100 expired trash threads per run. Those bounds are technical limits. They do not change Free, Starter, or Pro. The guide is /docs/folders.
An inbox stores at most 20 rules. The next create returns HTTP 409 rule_limit. Auto-reply cooldown_hours is an integer from 1 to 720 and defaults to 24. The same sender does not get another auto-reply from that rule until the cooldown ends. Those bounds are technical limits. They do not change Free, Starter, or Pro. The guide is /docs/rules.
An inbox stores at most 5 auto-forward destinations. The next one returns HTTP 409 forwarding_limit. Confirmation email is limited to 5 per hour per IP and 3 per day per address. An inbox sends at most 30 of these forwards per rolling hour. Those bounds are technical limits. They do not change Free, Starter, or Pro. The guide is /docs/forwarding.
Sending health uses the trailing 7 days of this account's own mail, the same sent, bounced, and complained counts as GET /api/v1/metrics/rates. Below 50 sent messages the status stays active. At 50 or more, a bounce rate of 5% or a complaint rate of 0.1% is a warning and does not block sends. Sending pauses when the bounce rate is 10% and at least 5 messages bounced, or the complaint rate is 0.5% and at least 3 messages were complained. If both match, the reason is the bounce rate. Agent sends, replies, forwards, and draft sends then return HTTP 403 sending_paused and store nothing. Sending resumes automatically when the trailing 7-day rate falls below the pause threshold. Receiving, reading, drafts, SMS, voice, and owner notification mail keep working. GET /api/v1/sending-status reports the current status.
Free includes 1 custom domain. Starter includes 15 and Pro includes 200. Creating a domain past that cap returns HTTP 402 plan_limit_exceeded. Free cannot buy extra domains. A zone already on the operator Cloudflare account gets its DNS written automatically. A zone on that account that is not active stays manual. Any other DNS host is external: publish the records from POST /api/v1/domains. Adding a domain is the plan quota. Mail on that hostname stays off until custom-domain mail is enabled. Delete cleans up the records Cooper created. Volume above Pro: ops@avatar33.com.
SMS
Free includes 0 phone numbers and returns HTTP 402 plan_limit_exceeded. Starter can hold up to 3. Pro includes 3 numbers and 1,500 segments, and caps at 25. A billable number is $3/month and includes 100 segments. Extra segments are $10 per 500 (POST /api/v1/billing/sms-segments). Numbers are added to the Stripe subscription and prorated. Releasing a number lowers the quantity and is prorated. Segment packs are invoiced immediately on an increase, and a decrease is not credited.
A number can receive SMS. Account notification texts (a confirmation code, an approval-needed alert, and an unread-over-24-hours alert) are sent on Avatar 8 LLC's verified campaign. POST /api/v1/inboxes/{id}/sms returns HTTP 409 outbound_not_registered. An account can provision at most 3 numbers per 24 hours, and the same account waits 30 days before provisioning an E.164 it released. Outbound segments past the allowance return HTTP 402 plan_limit_exceeded. Details are on /docs/sms. Questions: ops@avatar33.com.
| Free | Starter | Pro | |
|---|---|---|---|
| Numbers | None | Up to 3 at $3/mo each | 3 included, up to 25 |
| Segments | None | 100 per number / month | 1,500 included, plus 100 per extra number |
| Extra segments | — | $10 per 500 | $10 per 500 |
Voice
Free includes no voice minutes. Starter includes 30 minutes per active number each month. Pro includes 300 minutes, plus 30 for each active number past the 3 included numbers. Extra minutes are $10 per 250 (POST /api/v1/billing/voice-minutes). POST /api/v1/billing/voice-minutes returns HTTP 404 and does not call Stripe.
Outbound calls past the allowance return HTTP 402 plan_limit_exceeded. Inbound calls still record a voicemail, capped at 60 seconds. An account can place at most 100 calls per UTC day. Calls allow US and Canada numbers. Details are on /docs/phone. Questions: ops@avatar33.com.
| Free | Starter | Pro | |
|---|---|---|---|
| Minutes | None | 30 per number / month | 300 included, plus 30 per extra number |
| Extra minutes | — | $10 per 250 | $10 per 250 |