Take a brand live
The brands.go_live operation: POST /api/v1/brands/{id}/go_live in the REST API and the brands_go_live tool in the MCP server.
/api/v1/brands/{id}/go_liveMoves the brand from test mode (test_only) to live, so it can take real payments, once every item of its
go-live checklist holds (brands.go_live_checklist). The brand's live processor connection is tested at the
processor first, and the test result is recorded on the connection. If anything is missing the call fails with
go_live_requirements_unmet and details.unmet lists what. A brand that is live already is returned as is.
After this, live API keys can be created for the brand and its live checkout sessions are accepted.
Call it in live mode, with a sign-in in the last 15 minutes in the console. Security tier for agents (it needs
approval). Needs brands:admin (organization owners and admins).
At a glance
- REST:
POST /api/v1/brands/{id}/go_live - MCP tool:
brands_go_live - Operation ID:
brands.go_live - Scope: Organization, or one of its legal entities or brands
- Permission:
brands:admin - Risk tier:
security - Dry run: Supported (send
Ownrecord-Dry-Run: true) - Idempotency:
Idempotency-Keyrequired - Modes: Live mode only
- Authentication: API key with the
brands:adminscope - Fresh sign-in: In the console, a sign-in within the last 15 minutes
- Since: M12
Request
Path parameters
| Field | Type | Description |
|---|---|---|
id | brd_… ID |
Body
This operation takes no body.
Response
200 OK with a JSON object:
| Field | Type | Description |
|---|---|---|
brand | object | |
brand.id | brd_… ID | |
brand.object | "brand" | |
brand.orgId | org_… ID | |
brand.entityId | ent_… ID | |
brand.slug | string | |
brand.name | string | |
brand.status | one of draft, test_only, live, suspended | |
brand.isPlatformBrand | boolean | |
brand.branding | object | |
brand.branding.logoUrl | string or null | |
brand.branding.iconUrl | string or null | |
brand.branding.primaryColor | string or null | |
brand.branding.accentColor | string or null | |
brand.branding.supportEmail | string or null | |
brand.branding.supportUrl | string or null | |
brand.branding.termsUrl | string or null | |
brand.branding.privacyUrl | string or null | |
brand.statementDescriptor | string | |
brand.statementDescriptorSuffix | string or null | |
brand.invoiceSeries | object | |
brand.invoiceSeries.invoice | string | |
brand.invoiceSeries.creditNote | string | |
brand.billingSettings | object | |
brand.billingSettings.dunning | object | |
brand.billingSettings.dunning.retryOffsetsDays | array of integer | |
brand.billingSettings.dunning.finalAction | one of unpaid, canceled | |
brand.billingSettings.entitlementGraceDays | integer | |
brand.billingSettings.sendInvoice | object | |
brand.billingSettings.sendInvoice.graceDays | integer | |
brand.billingSettings.cardExpiryReminders | boolean | |
brand.billingSettings.pausedEntitlements | boolean | |
brand.billingSettings.paymentBehavior | one of allow_incomplete, pending_if_incomplete | |
brand.policies | object | |
brand.policies.breakageRecognition | one of at_expiry, manual | at_expiry (the default) or manual (held as expired credits until recognised). |
brand.policies.supportRefundLimits | array of object | The support role's refund limit per currency (M8); a currency not listed has the default of 100 of it. |
brand.policies.supportRefundLimits[].amount | string | Integer micros as a string. |
brand.policies.supportRefundLimits[].currency | string | |
brand.policies.disputeWalletFreeze | boolean | Freeze the customer's wallets when a dispute opens (default true; §19.2, M8). |
brand.policies.taxIdUnavailable | one of charge_as_b2c, block | What a sale does when a tax ID couldn't be checked (§9.1 step 1; M13): charge_as_b2c (the default) or block. |
brand.portalSettings | object | |
brand.portalSettings.allowPlanChanges | boolean | Customers may switch plans along planChangeMatrix (no row: no switch). |
brand.portalSettings.planChangeMatrix | array of object | One row per price: a subscription item on fromPriceId may switch to any of toPriceIds (same mode and currency). |
brand.portalSettings.planChangeMatrix[].fromPriceId | price_… ID | |
brand.portalSettings.planChangeMatrix[].toPriceIds | array of price_… ID | |
brand.portalSettings.allowCancel | boolean | Customers may cancel their subscriptions. |
brand.portalSettings.cancelBehavior | one of period_end, immediate | A portal cancellation ends the subscription at the period end (default) or at once. |
brand.portalSettings.collectCancelReason | boolean | The portal asks why the customer cancels. |
brand.portalSettings.allowQuantityChanges | boolean | Customers may change the quantity (seats) of licensed items. |
brand.checkoutSettings | object | |
brand.checkoutSettings.locales | array of string | The brand's languages, its default first. A default, not a restriction: a customer's own language comes first. |
brand.checkoutSettings.collectPhone | boolean | |
brand.checkoutSettings.requireBusinessDetails | one of auto, always, never | |
brand.createdAt | date-time | |
brand.updatedAt | date-time | |
checklist | object | |
checklist.object | "go_live_checklist" | |
checklist.brandId | brd_… ID | |
checklist.entityId | ent_… ID | |
checklist.brandStatus | string | |
checklist.ready | boolean | Every requirement is met: brands.go_live will move the brand to live. |
checklist.live | boolean | The brand is live already. |
checklist.items | array of object | |
checklist.items[].requirement | one of 10 values, e.g. plan_livemode, org_status, legal_accepted (all in the OpenAPI document) | |
checklist.items[].met | boolean | |
checklist.items[].reason | string or null | Why it isn't met, in plain words. |
checklist.processor | object or null | The brand's live processor connection, with its last connection test. |
checklist.legalVersions | object | |
checklist.legalVersions.terms | string | |
checklist.legalVersions.dpa | string | |
checklist.legalAccepted | object | Whether the organization accepted the current version of each document. |
checklist.legalAccepted.terms | boolean | |
checklist.legalAccepted.dpa | boolean |
Examples
Every item holds
POST /api/v1/brands/brd_01m4tx5nj8emwbyf7y9vcf47x4/go_live
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Response (200):
{
"brand": {
"id": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"object": "brand",
"orgId": "org_01m4tx5nj7ekd958x53w4bntcg",
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
"slug": "acme-app",
"name": "Acme App",
"status": "live",
"isPlatformBrand": false,
"branding": {
"logoUrl": null,
"iconUrl": null,
"primaryColor": null,
"accentColor": null,
"supportEmail": null,
"supportUrl": null,
"termsUrl": null,
"privacyUrl": null
},
"statementDescriptor": "ACME APP",
"statementDescriptorSuffix": null,
"invoiceSeries": {
"invoice": "ACM",
"creditNote": "ACM-CN"
},
"billingSettings": {
"dunning": {
"retryOffsetsDays": [1, 3, 5, 7],
"finalAction": "unpaid"
},
"entitlementGraceDays": 7,
"sendInvoice": {
"graceDays": 14
},
"cardExpiryReminders": true,
"pausedEntitlements": false,
"paymentBehavior": "allow_incomplete"
},
"policies": {
"breakageRecognition": "at_expiry",
"supportRefundLimits": [],
"disputeWalletFreeze": true,
"taxIdUnavailable": "charge_as_b2c"
},
"portalSettings": {
"allowPlanChanges": true,
"planChangeMatrix": [],
"allowCancel": true,
"cancelBehavior": "period_end",
"collectCancelReason": true,
"allowQuantityChanges": false
},
"checkoutSettings": {
"locales": ["en", "hr"],
"collectPhone": false,
"requireBusinessDetails": "auto"
},
"createdAt": "2026-10-13T12:00:00.000Z",
"updatedAt": "2026-10-13T12:00:00.000Z"
},
"checklist": {
"object": "go_live_checklist",
"brandId": "brd_01m4tx5nj8emwbyf7y9vcf47x4",
"entityId": "ent_01m4tx5nj8emwbyf7y9vcf47x2",
"brandStatus": "live",
"ready": true,
"live": true,
"items": [
{
"requirement": "plan_livemode",
"met": true,
"reason": null
},
{
"requirement": "org_status",
"met": true,
"reason": null
},
{
"requirement": "legal_accepted",
"met": true,
"reason": null
},
{
"requirement": "entity_verified",
"met": true,
"reason": null
},
{
"requirement": "invoice_settings",
"met": true,
"reason": null
},
{
"requirement": "home_registration",
"met": true,
"reason": null
},
{
"requirement": "processor_live",
"met": true,
"reason": null
},
{
"requirement": "brand_urls",
"met": true,
"reason": null
},
{
"requirement": "brand_status",
"met": true,
"reason": null
}
],
"processor": {
"connectionId": "pcon_01m4tx5nj8emwbyf7y9vcf47xd",
"processor": "stripe",
"status": "active",
"lastTestOk": true,
"lastTestAt": "2026-10-26T09:00:00.000Z"
},
"legalVersions": {
"terms": "1.0",
"dpa": "1.0"
},
"legalAccepted": {
"terms": true,
"dpa": false
}
}
}
Errors
| Code | HTTP status | When | What to do |
|---|---|---|---|
go_live_requirements_unmet | 409 | A requirement isn't met (details.unmet, details.items); the brand stays in test mode. | Open the brand's go-live checklist (brands.go_live_checklist) and complete the open items. |
mode_not_supported | 400 | The request is in test mode. | Use the mode the operation supports (details.supported_mode): test-only operations such as test clocks need test-mode credentials. |
processor_request_failed | 502 | The processor couldn't be reached for the connection test. | If retryable is true, retry with the same Idempotency-Key after a short wait; otherwise check details.code. |
upstream_timeout | 502 | The processor didn't answer the connection test in time. | Retry the request with the same Idempotency-Key after a short wait. |
version_conflict | 409 | The brand changed at the same time; try again. | Fetch the object again and retry the change. |
resource_not_found | 404 | No such brand in your scope. | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode. |
livemode_not_allowed | 403 | You have no live-mode access. | Use test mode, or credentials for the target's mode. Developers need live access granted by an organization owner or admin. |
fresh_auth_required | 403 | Your last sign-in is older than 15 minutes. | Sign in again, then repeat the action within 15 minutes. |
permission_denied | 403 | You can't take this brand live. | Ask an organization owner or admin for a role or scope that allows this action. |
It can also return these common errors: validation_failed, api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.