post /v1/billing/checkout
Start a Stripe Checkout for a plan; returns the URL for the human
scope budget:write · startCheckout
Body · JSON
plan "plus" | "household" | "founder" · required
period "month" | "year" · required · default "month"
attribution object
attribution.utm_source string · ≤ 200 chars
attribution.utm_medium string · ≤ 200 chars
attribution.utm_campaign string · ≤ 200 chars
attribution.utm_term string · ≤ 200 chars
attribution.utm_content string · ≤ 200 chars
attribution.gclid string · ≤ 200 chars
attribution.gbraid string · ≤ 200 chars
attribution.wbraid string · ≤ 200 chars
attribution.fbclid string · ≤ 200 chars
attribution.rdt_cid string · ≤ 200 chars
attribution.landing string · ≤ 200 chars
attribution.at integer · > 0
ad_consent "granted" | "denied"
Returns · 201
{ url, plan, period, mode }. mode is subscription for plus and household (30-day trial, card required), payment for the one-time founder seat, or switch (200, url: null) when the budget already subscribes and the live subscription moved to the other plan or the other period (monthly ↔ yearly), prorated. Give the URL to the human; when they finish, the webhook sets the plan and GET /v1/me reports it, so poll entitlements rather than assuming. Plus is for one person; Household is what a second person in the budget needs (entitlements.member_blocked). 409 billing_conflict when the tenant already holds that plan, when founder seats are gone, or when household is asked for on a key's personal tenant.
Example
Errors · besides 401, 429, 500
- 400
validation_failed: The request body or query is malformed. The message names the offending field; fix it and retry. - 403
forbidden: The key is valid but lacks the scope this call needs. Ask the human to mint a key with the scope named in the message. - 409
idempotency_conflict: This Idempotency-Key was used for a different request, or the first request is still in flight. Retry the in-flight case after a second; use a fresh key for a genuinely different request.billing_conflict: The billing state does not allow this: the tenant already holds that plan, founder seats are gone, or the extra-bank count would drop below the banks in use. The message says which; nothing to retry until the human acts. - 503
billing_unavailable: Checkout and billing are not connected on this deployment yet. Tell the human; nothing to retry.