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

PlanMonthly baseIncluded
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

Upgrading to Developer

From the dashboard

  1. Open /dash/<slug>/billing and sign in.
  2. Click Upgrade — Stripe Checkout (shown while your org is on the Free tier).
  3. You are redirected to a Stripe Checkout session and pay there. Promotion codes are accepted.
  4. On success you are redirected back to the dashboard. The checkout.session.completed webhook switches your org to paid immediately — 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

  1. Your org's tier changes to past_due and you receive the payment-failed email. There is a 7-day grace period: existing mk_live_* / mk_svc_* keys keep working and downloads continue uninterrupted, but issuing new mk_live_* / mk_svc_* keys returns HTTP 402 until the org is back on paid.
  2. If the subscription is not brought current and Stripe marks it unpaid or canceled, the tier becomes canceled: issuing new mk_live_* / mk_svc_* keys is blocked, custom-model eligibility is withdrawn, and the staging quota returns to 10 / month.
  3. 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

  1. Open the customer portal (Manage subscription or manashiki billing portal).
  2. Pay the open invoice or update your payment method.
  3. When Stripe confirms payment (invoice.paid), the webhook automatically returns your tier to paid — no support ticket needed. If the subscription was fully canceled, run the upgrade flow again instead.
  4. Verify with manashiki billing status or 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:

TierMeaning
freeNo subscription. Staging only, 10 DLs / month.
paidActive Developer subscription. All gates open.
past_dueA payment failed; 7-day grace — existing keys keep working, new live / service key issuance is paused.
canceledSubscription ended or unpaid. Live / service key issuance and custom models suspended; staging quota back to 10 / month.
enterpriseCustom 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.