Skip to content

Plans, limits and changing plan

Four plans. Every limit is visible in the API before you hit it, every refusal names the capability that caused it, and changing plan is a conversation rather than a checkout.

Last updated

What each plan includes

FreeHobbyStarterPro
Price$0$9 / month$29 / month$99 / month
API requests / month10,000100,000500,0005,000,000
Rate limit5 / s10 / s30 / s100 / s
Projects12525
Posts1001,00025,000Unlimited
API keys2520100
Members121050
Full-text searchYesYesYes
Media uploadsYesYesYes
Bring your own MongoDBYesYes
Per-endpoint analyticsYesYesYes
Over the request limitRefusedRefusedRefusedBilled as overage

What happens at a limit

LimitResponseDetail you get
Requests per second429 RATE_LIMIT_EXCEEDEDpolicy, limit, retryAfterSeconds
Requests per month429 QUOTA_EXCEEDEDThe capability and the period
Posts, projects, keys, members403 ENTITLEMENT_REQUIREDcapability, limit, current
A feature the plan lacks403 ENTITLEMENT_REQUIREDcapability, currentPlans, upgradeUrl

A count limit refuses at the limit — not one past it, and not one short. If your plan allows two keys, the third request is the one refused, and it tells you the number.

Changing plan

There is no card on file and no checkout. You ask for a plan, somebody reads the request, and the limits move. We invoice separately. That is a deliberate choice while the platform is young: a payment provider is a compliance surface and a webhook consumer, and neither is worth carrying before there is anybody to bill.

  1. Ask

    From the Plan screen in the dashboard, or from the API. Only the workspace owner can — choosing what the company pays for is an owner’s decision, and an agent token can never hold it.

    Examplebash
    curl -X POST https://api.cmskite.com/v1/plan-requests \
      -H "authorization: Bearer $ACCESS_TOKEN" \
      -H "x-tenant-id: $WORKSPACE_ID" \
      -H 'content-type: application/json' \
      -d '{ "planCode": "blog_pro", "note": "Traffic doubled this month." }'
  2. Wait, with everything still working

    Asking is not getting. Your current plan keeps working exactly as before while the request is open, and you can withdraw it. One open request at a time.

  3. It takes effect

    Once approved, your subscription moves in a single transaction and every credential you hold is resolving the new limits within about five seconds. You see the decision and the reason in your plan history.

Downgrading never deletes anything

Move from Pro to Free with 900 posts and you keep all 900. They stay readable, editable and served. The next create is refused; nothing that exists is removed, archived or hidden.

The same rule holds if an invoice goes unpaid: access degrades to the free plan after a grace period rather than stopping. We never revoke read access to data a customer created. A platform that deletes content on downgrade is a platform nobody can safely try.