Billing
The plan, the subscription, checkout, the portal, the trial, invoices, and the public pricing endpoint.
| Method | Path | Needs | Returns |
|---|---|---|---|
| GET | /pricing | public | plans, prices, limits and AI task costs; cached five minutes |
| GET | /billing/overview | organization.read | plan, subscription, credits, payment methods on offer |
| POST | /billing/checkout | billing.manage | 201 { checkout { url } }; { priceCode, provider? } |
| POST | /billing/portal | billing.manage | 201 { url } from the method that is paying |
| POST | /billing/subscription/change | billing.manage | { priceCode } → { subscription, transition, approval } |
| POST | /billing/subscription/cancel | billing.manage | at the period end; entitlements continue until then |
| POST | /billing/subscription/reactivate | billing.manage | clears the cancellation |
| POST | /billing/trial | billing.manage | starts the one free trial |
| GET | /billing/invoices/:id/pdf | billing.manage | the invoice, or the receipt naming the reseller |
| POST | /billing/webhooks/stripe | public, signed | 202 { eventId, status } |
| POST | /billing/webhooks/paypal | public, signed | the same, in PayPal’s dialect |
| POST | /billing/webhooks/paddle | public, signed | the same, in Paddle’s dialect |
Prices are server-owned and the browser never tells the backend that a payment happened: only a verified webhook or a normalized provider response writes paid state. A per-method surcharge, if one is configured, is disclosed before the click and frozen on the checkout.
Something here wrong, missing or out of date? Tell us and we will fix the page.