Limits and pricing
What each plan includes, what happens at the limit, and the rate limits every API key shares.
Plans
You pay for active live domains. A domain counts on a day if it is active at 23:59 UTC; the month's count is the daily average, rounded up. Test domains are free and never count.
| Plan | Price | Domains included | Then per domain | Hard cap | Egress |
|---|---|---|---|---|---|
| Free | $0/mo | 3 | – | 3 | 25 GB |
| Starter | $39/mo | 50 | $0.50 | 100 | 250 GB |
| Growth | $129/mo | 300 | $0.35 | 600 | 1 TB |
| Scale | $399/mo | 1,500 | $0.20 | 3,000 | 5 TB |
| Enterprise | from $1,500/mo | 10,000 | $0.12 | 20,000 | Custom |
- Egress past the allowance costs $0.08 per GB on every plan. Annual billing gets two months free.
- New accounts start on Free promotional during the launch: 20 live domains at no charge, live keys included, egress as on Free, never invoiced. Payments aren't switched on yet: to change plan, email support@apexly.dev.
- Plain Free needs a plan (or a card on file) before you create a live key (
402 live_keys_need_plan); test keys never do. - Growth adds white-label CNAME targets (
403 plan_requiredbelow it); Scale adds a custom origin per domain.
The hard cap
Each plan stops at its hard cap: twice the included domains on paid plans, three on Free, twenty on Free promotional. Counting every live domain in the account that is not deleted, whatever its state, creating one more fails with 422 domain_limit_reached, and the dashboard offers the plans that fit. Delete unused domains or choose a larger plan. New accounts can also create at most 10 domains in their first 24 hours, deleted ones included.
Unpaid invoices
If a payment fails, the account keeps working for 14 days. After that it is suspended: API writes fail with 403 account_suspended, existing domains keep serving for 14 more days, and then routing stops. Certificates are never deleted, so updating the card restores everything at once.
Rate limits
Limits are per app, counted over a sliding minute, and shared by every key of the app.
| What | Limit |
|---|---|
Writes (POST, PATCH, DELETE) | 60 per minute |
Reads (GET) | 600 per minute |
POST /v1/domains/{id}/verify | 1 per 15 seconds per domain, 30 per minute per app |
Certificate retries (verify on cert_failed) | 10 per hour per app |
POST /v1/events/{id}/redeliver | 10 per minute |
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Over the limit you get 429 rate_limited with Retry-After in seconds.
Request limits
| What | Limit |
|---|---|
| Request body | 100 KB (413 payload_too_large) |
metadata | 4 KB of JSON, returned on every object and event |
| Page size | ?limit= up to 100 (default 50), cursor-paginated |
Idempotency-Key | Honoured for 24 hours on every POST |
| Webhook reply | 10 seconds, then retried |