> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Change Wix plan

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Moves a Wix-billed workspace to another plan. Take `new_product_id` from `wix_product_id` in [List plans](/api-reference/list-plans). Only the workspace owner can change the plan.

<Warning>An upgrade takes effect now and charges the workspace's saved payment method right away, with no confirmation step. Check the amount first with [Preview Wix plan change](/api-reference/preview-wix-plan-change).</Warning>

- **Upgrade** (a bigger plan): the response has `invoice_id`. A declined card returns 402 with `detail.error_type` set to `payment_failed`, and an unpaid invoice on the plan returns 402 with `past_due`.
- **Downgrade** (a smaller plan): takes effect at the end of the billing period, and nothing is charged now. The response has `is_downgrade` set to `true`. A downgrade keeps the billing period, and only one change can be scheduled at a time. Undo it with [Cancel scheduled plan change](/api-reference/cancel-scheduled-plan-change).

You can switch from monthly to yearly billing, but not from yearly to monthly. A downgrade also turns a plan that's set to end back to renewing.

To retry an upgrade safely, send an `Idempotency-Key` header and repeat it on the retry: Wix then charges the order once. Without the header, each request is a new charge attempt, so check [Get billing info](/api-reference/get-billing-info) before you retry.

This works only for workspaces billed through Wix. For a Stripe-billed workspace, use [Change plan](/api-reference/change-plan). Wix billing is still rolling out, so this can return 404 for your account.

The base rate limit is 10 requests per hour per user. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/billing/dynamic-offering/update-subscription
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/billing/dynamic-offering/update-subscription:
    post:
      summary: Change Wix plan
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Moves a Wix-billed workspace to another plan. Take `new_product_id` from
        `wix_product_id` in [List plans](/api-reference/list-plans). Only the
        workspace owner can change the plan.


        <Warning>An upgrade takes effect now and charges the workspace's saved
        payment method right away, with no confirmation step. Check the amount
        first with [Preview Wix plan
        change](/api-reference/preview-wix-plan-change).</Warning>


        - **Upgrade** (a bigger plan): the response has `invoice_id`. A declined
        card returns 402 with `detail.error_type` set to `payment_failed`, and
        an unpaid invoice on the plan returns 402 with `past_due`.

        - **Downgrade** (a smaller plan): takes effect at the end of the billing
        period, and nothing is charged now. The response has `is_downgrade` set
        to `true`. A downgrade keeps the billing period, and only one change can
        be scheduled at a time. Undo it with [Cancel scheduled plan
        change](/api-reference/cancel-scheduled-plan-change).


        You can switch from monthly to yearly billing, but not from yearly to
        monthly. A downgrade also turns a plan that's set to end back to
        renewing.


        To retry an upgrade safely, send an `Idempotency-Key` header and repeat
        it on the retry: Wix then charges the order once. Without the header,
        each request is a new charge attempt, so check [Get billing
        info](/api-reference/get-billing-info) before you retry.


        This works only for workspaces billed through Wix. For a Stripe-billed
        workspace, use [Change plan](/api-reference/change-plan). Wix billing is
        still rolling out, so this can return 404 for your account.


        The base rate limit is 10 requests per hour per user. See [Rate
        limits](/developers/references/apps-api/get-started/rate-limits) for the
        multiplier your plan gets.


        <Warning>The response includes fields beyond the ones documented here.
        Don't rely on undocumented response fields, as they can change at any
        time.</Warning>
      operationId: >-
        update_dynamic_offering_subscription_api_billing_dynamic_offering_update_subscription_post
      parameters:
        - name: Idempotency-Key
          in: header
          required: false
          schema:
            type: string
            minLength: 8
            maxLength: 100
            description: >-
              A key you generate for this plan change. Send the same key when
              you retry it, and a new one for every other change.
            title: Idempotency-Key
          description: >-
            A key you generate for this plan change. Send the same key when you
            retry it, and a new one for every other change.
          example: upgrade-2026-10-25-7f3c9a1e
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateDynamicOfferingRequest'
      responses:
        '200':
          description: The upgrade was charged, or the downgrade scheduled.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WixPlanChangeResult'
              example:
                success: true
                invoice_id: 2025-0001234
        '400':
          description: >-
            `new_product_id` isn't a Base44 plan, the workspace isn't billed
            through Wix, the change isn't allowed (yearly to monthly billing, a
            downgrade that changes the billing period, or a Business plan
            cheaper than the current plan), or Base44 couldn't open a Wix
            billing session for you.
        '401':
          description: >-
            Missing or invalid credentials. A read-only token gets this response
            too.
        '402':
          description: >-
            The card was declined (`detail.error_type` is `payment_failed`), or
            the plan has an unpaid invoice (`past_due`).
        '403':
          description: >-
            You aren't the workspace owner, a payment dispute is open on the
            workspace, or the plan you chose isn't available to you.
        '404':
          description: Wix billing isn't available to your account yet.
        '409':
          description: >-
            Another plan change is already scheduled (`detail.error_type` is
            `downgrade_not_allowed`).
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
              example:
                detail:
                  - type: literal_error
                    loc:
                      - body
                      - period_unit
                    msg: Input should be 'MONTH' or 'YEAR'
                    input: WEEK
                    ctx:
                      expected: '''MONTH'' or ''YEAR'''
        '429':
          description: >-
            Rate limit exceeded. The base rate limit is 10 requests per hour per
            user. See [Rate
            limits](/developers/references/apps-api/get-started/rate-limits) for
            the multiplier your plan gets.
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    UpdateDynamicOfferingRequest:
      properties:
        new_product_id:
          type: string
          maxLength: 100
          minLength: 1
          title: New Product Id
          description: >-
            Wix product of the plan to move to, from `wix_product_id` in [List
            plans](/api-reference/list-plans).
          example: 5f0c7a2e-3b91-4d6a-9e0f-2c8b1d4a7e63
        period_unit:
          type: string
          enum:
            - MONTH
            - YEAR
          title: Period Unit
          description: 'Billing period of the new plan: `MONTH` or `YEAR`.'
          example: MONTH
      type: object
      required:
        - new_product_id
        - period_unit
      title: UpdateDynamicOfferingRequest
    WixPlanChangeResult:
      properties:
        success:
          type: boolean
          title: Success
          description: Always `true`. A failure returns an error status instead.
          example: true
        is_downgrade:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Is Downgrade
          description: >-
            `true` when the change is a downgrade scheduled for the end of the
            billing period. Not returned on an upgrade.
          example: true
        invoice_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Invoice Id
          description: >-
            ID of the invoice the upgrade was charged on. Not returned on a
            downgrade.
          example: 2025-0001234
      type: object
      required:
        - success
      title: WixPlanChangeResult
      description: The outcome of a Wix plan change.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: >-
        Personal access token, sent as `Authorization: Bearer <token>`. Each
        operation lists the permission it needs: `read_only` or `full_access`. A
        full-access token can call every operation. A read-only token can call
        only the operations that list `read_only`; anything else returns 403
        `read_only_credential_route_not_allowed`.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.