Skip to content

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.

POST/api/v1/brands/{id}/go_live

Moves 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-Key required
  • Modes: Live mode only
  • Authentication: API key with the brands:admin scope
  • Fresh sign-in: In the console, a sign-in within the last 15 minutes
  • Since: M12

Request

Path parameters

FieldTypeDescription
idbrd_… ID

Body

This operation takes no body.

Response

200 OK with a JSON object:

FieldTypeDescription
brandobject
brand.idbrd_… ID
brand.object"brand"
brand.orgIdorg_… ID
brand.entityIdent_… ID
brand.slugstring
brand.namestring
brand.statusone of draft, test_only, live, suspended
brand.isPlatformBrandboolean
brand.brandingobject
brand.branding.logoUrlstring or null
brand.branding.iconUrlstring or null
brand.branding.primaryColorstring or null
brand.branding.accentColorstring or null
brand.branding.supportEmailstring or null
brand.branding.supportUrlstring or null
brand.branding.termsUrlstring or null
brand.branding.privacyUrlstring or null
brand.statementDescriptorstring
brand.statementDescriptorSuffixstring or null
brand.invoiceSeriesobject
brand.invoiceSeries.invoicestring
brand.invoiceSeries.creditNotestring
brand.billingSettingsobject
brand.billingSettings.dunningobject
brand.billingSettings.dunning.retryOffsetsDaysarray of integer
brand.billingSettings.dunning.finalActionone of unpaid, canceled
brand.billingSettings.entitlementGraceDaysinteger
brand.billingSettings.sendInvoiceobject
brand.billingSettings.sendInvoice.graceDaysinteger
brand.billingSettings.cardExpiryRemindersboolean
brand.billingSettings.pausedEntitlementsboolean
brand.billingSettings.paymentBehaviorone of allow_incomplete, pending_if_incomplete
brand.policiesobject
brand.policies.breakageRecognitionone of at_expiry, manualat_expiry (the default) or manual (held as expired credits until recognised).
brand.policies.supportRefundLimitsarray of objectThe support role's refund limit per currency (M8); a currency not listed has the default of 100 of it.
brand.policies.supportRefundLimits[].amountstringInteger micros as a string.
brand.policies.supportRefundLimits[].currencystring
brand.policies.disputeWalletFreezebooleanFreeze the customer's wallets when a dispute opens (default true; §19.2, M8).
brand.policies.taxIdUnavailableone of charge_as_b2c, blockWhat a sale does when a tax ID couldn't be checked (§9.1 step 1; M13): charge_as_b2c (the default) or block.
brand.portalSettingsobject
brand.portalSettings.allowPlanChangesbooleanCustomers may switch plans along planChangeMatrix (no row: no switch).
brand.portalSettings.planChangeMatrixarray of objectOne row per price: a subscription item on fromPriceId may switch to any of toPriceIds (same mode and currency).
brand.portalSettings.planChangeMatrix[].fromPriceIdprice_… ID
brand.portalSettings.planChangeMatrix[].toPriceIdsarray of price_… ID
brand.portalSettings.allowCancelbooleanCustomers may cancel their subscriptions.
brand.portalSettings.cancelBehaviorone of period_end, immediateA portal cancellation ends the subscription at the period end (default) or at once.
brand.portalSettings.collectCancelReasonbooleanThe portal asks why the customer cancels.
brand.portalSettings.allowQuantityChangesbooleanCustomers may change the quantity (seats) of licensed items.
brand.checkoutSettingsobject
brand.checkoutSettings.localesarray of stringThe brand's languages, its default first. A default, not a restriction: a customer's own language comes first.
brand.checkoutSettings.collectPhoneboolean
brand.checkoutSettings.requireBusinessDetailsone of auto, always, never
brand.createdAtdate-time
brand.updatedAtdate-time
checklistobject
checklist.object"go_live_checklist"
checklist.brandIdbrd_… ID
checklist.entityIdent_… ID
checklist.brandStatusstring
checklist.readybooleanEvery requirement is met: brands.go_live will move the brand to live.
checklist.livebooleanThe brand is live already.
checklist.itemsarray of object
checklist.items[].requirementone of 10 values, e.g. plan_livemode, org_status, legal_accepted (all in the OpenAPI document)
checklist.items[].metboolean
checklist.items[].reasonstring or nullWhy it isn't met, in plain words.
checklist.processorobject or nullThe brand's live processor connection, with its last connection test.
checklist.legalVersionsobject
checklist.legalVersions.termsstring
checklist.legalVersions.dpastring
checklist.legalAcceptedobjectWhether the organization accepted the current version of each document.
checklist.legalAccepted.termsboolean
checklist.legalAccepted.dpaboolean

Examples

Every item holds

HTTP
POST /api/v1/brands/brd_01m4tx5nj8emwbyf7y9vcf47x4/go_live
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14

Response (200):

JSON
{
  "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

CodeHTTP statusWhenWhat to do
go_live_requirements_unmet409A 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_supported400The 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_failed502The 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_timeout502The processor didn't answer the connection test in time.Retry the request with the same Idempotency-Key after a short wait.
version_conflict409The brand changed at the same time; try again.Fetch the object again and retry the change.
resource_not_found404No such brand in your scope.Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.
livemode_not_allowed403You 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_required403Your last sign-in is older than 15 minutes.Sign in again, then repeat the action within 15 minutes.
permission_denied403You 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.