Purchase & billing
How to upgrade an organization to the paid Developer plan, manage the subscription, read your receipts, and recover from a failed payment. For the full price table see /pricing; that page is canonical.
Plans at a glance
| Plan | Monthly base | Included |
|---|---|---|
| Free | $0 | 10 staging DLs / month, first-party catalog access, 1× mk_test_* key, 30-day audit log |
| Developer | $15 / month | 1,000 production DLs included, then $0.001 / DL; staging DLs uncapped at launch (1,000-included + $0.0005 / DL overage planned); 5 custom models; 10 GB storage; 5× mk_svc_* keys; 90-day audit log |
| Enterprise | Custom | Volume DL pricing, 99.9% SLA + dedicated R2 bucket, SSO (SAML / OIDC), up to 7-year audit log |
- All prices in USD. Stripe Tax adds JCT (10%) for Japan-resident customers.
- 1 DL = one successful
GET /api/download/:modelIdresponse. - Staging quotas reset at the start of each calendar month (UTC).
mk_live_*(production) andmk_svc_*(agent / CI) keys require a paid plan — issuing one on the Free tier returns HTTP 402.
Upgrading to Developer
From the dashboard
- Open
/dash/<slug>/billingand sign in. - Click Upgrade — Stripe Checkout (shown while your org is on the Free tier).
- You are redirected to a Stripe Checkout session and pay there. Promotion codes are accepted.
- On success you are redirected back to the dashboard. The
checkout.session.completedwebhook switches your org topaidimmediately — no manual review.
The Upgrade button calls this endpoint (session-authenticated) and redirects to the returned URL:
POST /v1/orgs/<slug>/billing/checkout
→ { "url": "https://checkout.stripe.com/...", "sessionId": "cs_..." } From the CLI
manashiki billing upgrade [--org <slug>] # opens Stripe Checkout in your browser manashiki billing status [--org <slug>] # verify the tier after paying
If you omit --org, the CLI uses the org selected with
manashiki orgs select <slug>. After paying, your keys
immediately work for production.
Upgrading unlocks mk_live_* and mk_svc_* key
issuance, lifts the staging quota, and marks your org eligible for
custom (org-private) models — model registration itself is currently
operator-assisted; contact support to onboard a custom model.
Managing your subscription
Payment methods, invoice history, and cancellation are handled in the
Stripe customer portal. From /dash/<slug>/billing,
click Manage subscription (shown once you are on a
paid tier), or use the CLI:
manashiki billing portal [--org <slug>] # opens the Stripe Customer Portal
Both call:
POST /v1/orgs/<slug>/billing/portal
→ { "url": "https://billing.stripe.com/..." }
In the portal you can update your card, view and download past
invoices, and cancel. If your org has never checked out, the portal
call returns HTTP 409 no_customer — run the upgrade flow
first.
Receipts & invoices
Invoices are issued by Stripe. Every invoice has a hosted invoice page and a downloadable PDF, available from the customer portal.
In addition, the service emails your org contact address (falling back to the email on your Stripe customer; rolling out with the current release):
- Receipt when an invoice is paid — amount paid, invoice number, hosted invoice link, and PDF link.
- Payment-failed notice when a charge fails — amount due, an explanation of the 7-day grace period, and a link to pay or update your payment method.
Refunds: the monthly base fee is fully refundable within 7 days of signup if your org has fewer than 100 total downloads. Usage charges (metered downloads) are not refundable. See the 特定商取引法に基づく表記 for the full policy.
If a payment fails
-
Your org's tier changes to
past_dueand you receive the payment-failed email. There is a 7-day grace period: existingmk_live_*/mk_svc_*keys keep working and downloads continue uninterrupted, but issuing newmk_live_*/mk_svc_*keys returns HTTP 402 until the org is back onpaid. -
If the subscription is not brought current and Stripe marks it
unpaidorcanceled, the tier becomescanceled: issuing newmk_live_*/mk_svc_*keys is blocked, custom-model eligibility is withdrawn, and the staging quota returns to 10 / month. - Your keys are not deleted, and the org's Stripe customer and subscription IDs are kept, so reactivating restores full access without re-creating anything.
Restoring service
- Open the customer portal (Manage subscription or
manashiki billing portal). - Pay the open invoice or update your payment method.
-
When Stripe confirms payment (
invoice.paid), the webhook automatically returns your tier topaid— no support ticket needed. If the subscription was fully canceled, run the upgrade flow again instead. - Verify with
manashiki billing statusor the billing status endpoint below.
Checking your entitlements
GET /v1/orgs/<slug>/billing/status
→ {
"tier": "paid",
"currentPeriodEnd": "2026-07-01T00:00:00.000Z",
"stagingQuotaUsed": 4,
"stagingQuotaLimit": null,
"liveDownloadsThisPeriod": 312,
"customModelAllowed": true,
"liveKeyIssuanceAllowed": true,
"serviceKeyIssuanceAllowed": true,
"downloadGuardrails": { ... },
"supportContactMailto": "mailto:..."
} Tier values:
| Tier | Meaning |
|---|---|
free | No subscription. Staging only, 10 DLs / month. |
paid | Active Developer subscription. All gates open. |
past_due | A payment failed; 7-day grace — existing keys keep working, new live / service key issuance is paused. |
canceled | Subscription ended or unpaid. Live / service key issuance and custom models suspended; staging quota back to 10 / month. |
enterprise | Custom contract. |
A stagingQuotaLimit or guardrail limit of
null means unlimited. After fixing a payment, re-check
this endpoint (or click Refresh on the billing page) —
the tier flips back as soon as the webhook lands.
Download guardrails
Downloads pass through a set of guardrails. Their live state is shown
on /dash/<slug>/billing and in the
downloadGuardrails object of the status endpoint.
Staging quota (Free tier)
Free orgs get 10 staging downloads per month. The 11th request returns
HTTP 402 payment_required with
reason: "staging_quota_exceeded", your current usage, and
a checkout URL. Upgrading lifts the quota immediately.
Live download cap (auto-stop)
Paid orgs can have a per-period cap on billable live downloads
(unlimited by default). Auto-stop is armed by default: when usage
reaches the cap, live downloads are suspended and further requests
return HTTP 402 with reason: "live_download_cap_reached",
including used, limit,
remaining, and the support contact. The suspension clears
automatically when the next billing period starts and usage resets.
Concurrent download limit
Each org may hold at most 25 concurrently active signed download URLs
by default. Exceeding it returns HTTP 429 with
reason: "concurrent_download_limit_reached". Slots free up
when your client releases its lease after finishing
(DELETE /api/download/lease/:requestId) or automatically
after the 10-minute lease backstop. A separate per-key download rate
limit also returns HTTP 429 when exceeded.
Service-wide suspension
During an incident, operators can engage a global kill switch; all
downloads then return HTTP 503 downloads_suspended. Its
state appears as killSwitch.enabled in the billing status.
Cap, concurrency, suspension, and kill-switch errors include a support contact in their details (the staging-quota 402 carries a checkout URL instead). If a limit blocks you, write to contact@utakata-scifi.com.