Go live (production)
Go live (production)
Promote your existing app to production — top up, set a cap, activate. Do not create a new app.
A production runtime key (ck_...) is valid but blocked until the app is activated: runtime
calls return 403 with detail.code = "production_not_active" until then. Activation has exactly two
gates, and it promotes the app you already have — keeping its app id, characters, keys, and
balance.
Do not create a new app to “go to production.” Character slugs are globally unique across all
apps, so you cannot recreate your characters in a fresh app — a new production app starts empty and
stuck. Promote the existing app that already holds your characters (the same one your runtime key
belongs to; GET /v1/me returns its app_id).
The two activation gates
GET /v1/account/apps/{app_id}/production-readiness returns checks[], blockers[], and
next_actions[]. The two checks:
billing_active— your workspace has billing connected (a prepaid top-up).app_hard_cap— the app has an enforced spend cap so runtime spend fails closed. A workspace top-up alone does not satisfy this — the cap is per-app.
Activate
Top up to connect billing
Top up workspace credits at
https://console.loreos.app/console/billing (a card
payment activates billing). A coding agent can instead call POST /v1/account/billing/checkout
(account token, scope account:billing:write) to get a hosted Stripe checkout URL to hand to a human
— see Self-serve access → Prepaid billing. Billing flips active once the
payment completes.
Check readiness
data.blockers must be empty. If not, data.next_actions names exactly what to do next (where to
top up, which cap to set).
If activation is blocked
POST .../production-activation returns 409 with detail.code = "production_activation_blocked"
plus the full readiness object (including next_actions) when a gate is unmet. Read
readiness.next_actions — it names exactly where to top up and which cap to set — then retry the
same activation call. You do not need to contact support or create another app.