Plans & billing
Billing is per-organization. Every org starts on Free; owners and admins upgrade from the dashboard’s Billing page, which hands off to Stripe for payment.
Plans
| Free | Pro | Platform | Enterprise | |
|---|---|---|---|---|
| Price | $0 | $29/user/mo | from $499/site/mo | contact us |
| Cloud capability invocations / month | 1,000 | 50,000 | 500,000 | unlimited (contract) |
| Burst limit (requests/second) | 2 | 10 | 50 | 200 |
| Audit-log retention | 90 days | 90 days | 365 days | unlimited |
Invocations are billable LLM-bound calls (describe, simplify, summarize, voice-action, …) per calendar month. Per-minute API rate limits are separate — see Rate limits. The Billing page shows this month’s usage against your quota, plus estimated LLM cost per capability.
Enterprise isn’t metered — limits are enforced by contract, and checkout doesn’t apply. Email enterprise@wholisphere.ai for custom pricing, dedicated support, or a BAA / DPA.
Upgrade
Dashboard: open Billing → Upgrade, pick Pro or Platform, and you’re redirected to Stripe Checkout. When payment completes, Stripe notifies our webhook and the org’s plan flips over — usually within seconds.
API (owner or admin, session-authenticated):
curl -X POST https://api.wholisphere.ai/v1/billing/checkout \ -H "cookie: whs_session=$SESSION" \ -H 'content-type: application/json' \ -d '{"orgId":"'$ORG_ID'","plan":"pro"}'# → { "url": "https://checkout.stripe.com/…", "sessionId": "cs_…" }plan accepts pro or platform. Redirect the browser to the returned url.
14-day Pro trial
Free orgs can start a 14-day Pro trial from the Billing page (POST /v1/billing/start-trial). You get the full Pro quota for 14 days; if you don’t add a payment method, the org reverts to Free automatically at the end of the trial. Orgs already on a paid plan get 409 not_eligible.
Manage your subscription
Billing → Manage subscription opens the Stripe Customer Portal, where you can update the payment method, download invoices, switch plans, or cancel.
curl -X POST https://api.wholisphere.ai/v1/billing/portal \ -H "cookie: whs_session=$SESSION" \ -H 'content-type: application/json' \ -d '{"orgId":"'$ORG_ID'"}'# → { "url": "https://billing.stripe.com/…" }If the org has never subscribed there’s no Stripe customer yet, so this returns 404 no_subscription — upgrade first.
What happens on downgrade or cancellation
When you cancel in the portal, the subscription runs until the end of the paid period (cancel_at_period_end), then Stripe fires customer.subscription.deleted and the org drops to Free. At that point:
- Quotas drop immediately to Free-tier limits (1,000 invocations/month, 2 req/s burst). Calls beyond the quota are rejected until the next calendar month.
- Audit-log retention shrinks to 90 days. A nightly retention job prunes audit events older than your plan’s window, so history you were keeping under a longer Platform window is deleted and can’t be recovered. Export anything you need before downgrading — see Audit log.
- Scan history, findings, products, and VPATs are kept — retention pruning applies to audit events, not scan data.
Upgrading again restores the higher quotas going forward; it does not resurrect pruned audit events.
Notes
- Billing endpoints require an owner or admin session; other members get
403 not_authorized. - On self-hosted or dev environments without Stripe configured, billing endpoints return
503 billing_disabled. - Subscription lifecycle is driven by the signed Stripe webhook (
POST /v1/webhooks/stripe) — there’s nothing to poll.