> ## 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.

# Remix an app

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

Creates a copy of an app in your workspace and makes you its owner. The remix is created in the workspace your personal access token is scoped to, so you need an editor-capable role in it. You can remix an app you own, collaborate on as an editor, or administer as a workspace admin, an approved template, or an app its owner marked as remixable and didn't make private. The app must be in your token's workspace too, unless it's an approved public template: those you can remix from any workspace, with a token that has access to all apps in its workspace, and the remix copies the template's approved version. Remixing a paid template requires that you bought it first. Call [Get remix requirements](/api-reference/get-remix-requirements) first to see which secrets the app needs.

The remix is named after the app with ` (Copy)` appended. When the app is an approved template, the remix copies the approved version of the template, name included, rather than the app's current state, unless you set `with_chat_history`.

The body takes only the fields below. Fields that [Create app](/api-reference/create-app) accepts, such as `name`, `user_description`, `public_settings`, `custom_instructions`, and `prevent_iframe_embedding`, are ignored here. The remix copies `user_description`, `public_settings`, and `custom_instructions` from the app and starts with `prevent_iframe_embedding` set to `true`. Rename the remix or change its description afterwards with [Update app](/api-reference/update-app). The API has no endpoint for changing the other settings yet.

The response returns as soon as the new app exists. Setting up its files can continue in the background, so poll [Get app](/api-reference/get-app) until its `status.state` is no longer `processing`. A token limited to selected apps doesn't gain access to the new app, so use a token with access to all apps in the workspace if you need to reach the remix afterwards. This endpoint is limited to 10 requests per minute.

<Warning>The new app is created before `secret_values` are applied and before the code is copied. A request that fails at either step, for example on an invalid `secret_values` entry, still leaves the new app in your workspace, and it counts toward your plan's app limit. Delete it before you retry.</Warning>

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/remix
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - PersonalAccessTokenAuth: []
paths:
  /api/apps/{app_id}/remix:
    post:
      summary: Remix an app
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Creates a copy of an app in your workspace and makes you its owner. The
        remix is created in the workspace your personal access token is scoped
        to, so you need an editor-capable role in it. You can remix an app you
        own, collaborate on as an editor, or administer as a workspace admin, an
        approved template, or an app its owner marked as remixable and didn't
        make private. The app must be in your token's workspace too, unless it's
        an approved public template: those you can remix from any workspace,
        with a token that has access to all apps in its workspace, and the remix
        copies the template's approved version. Remixing a paid template
        requires that you bought it first. Call [Get remix
        requirements](/api-reference/get-remix-requirements) first to see which
        secrets the app needs.


        The remix is named after the app with ` (Copy)` appended. When the app
        is an approved template, the remix copies the approved version of the
        template, name included, rather than the app's current state, unless you
        set `with_chat_history`.


        The body takes only the fields below. Fields that [Create
        app](/api-reference/create-app) accepts, such as `name`,
        `user_description`, `public_settings`, `custom_instructions`, and
        `prevent_iframe_embedding`, are ignored here. The remix copies
        `user_description`, `public_settings`, and `custom_instructions` from
        the app and starts with `prevent_iframe_embedding` set to `true`. Rename
        the remix or change its description afterwards with [Update
        app](/api-reference/update-app). The API has no endpoint for changing
        the other settings yet.


        The response returns as soon as the new app exists. Setting up its files
        can continue in the background, so poll [Get
        app](/api-reference/get-app) until its `status.state` is no longer
        `processing`. A token limited to selected apps doesn't gain access to
        the new app, so use a token with access to all apps in the workspace if
        you need to reach the remix afterwards. This endpoint is limited to 10
        requests per minute.


        <Warning>The new app is created before `secret_values` are applied and
        before the code is copied. A request that fails at either step, for
        example on an invalid `secret_values` entry, still leaves the new app in
        your workspace, and it counts toward your plan's app limit. Delete it
        before you retry.</Warning>


        <Warning>The response includes fields beyond the ones documented here.
        Don't rely on undocumented response fields, as they can change at any
        time. Send only the fields documented here. Other request fields are not
        supported and their behavior can change.</Warning>
      operationId: remix_app_api_api_apps__app_id__remix_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app to remix.
            title: App Id
          description: ID of the app to remix.
          example: 6820f3a4e7b91d003c45a1f2
        - name: Accept-Language
          in: header
          required: false
          schema:
            type: string
            description: >-
              Language to return generated text in, as a standard
              `Accept-Language` value. An unsupported language falls back to
              English.
            title: Accept-Language
          description: >-
            Language to return generated text in, as a standard
            `Accept-Language` value. An unsupported language falls back to
            English.
          example: de
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              title: RemixApp
              properties:
                with_chat_history:
                  type: boolean
                  default: false
                  description: >-
                    Whether to copy the app's chat history too. The remix then
                    copies the app's current state, even when the app is an
                    approved template. Only the app's owner, its editor-level
                    collaborators, and its workspace admins can set it.
                  example: false
                secret_values:
                  type: object
                  description: >-
                    Secrets to set on the remix, keyed by secret name. Set
                    `type` to `value` to provide the secret's value. Set `type`
                    to `clone` to copy the value of a secret on the source app,
                    named by `value` or, when you omit `value`, by the key
                    itself. You can clone a secret only from an app you own.
                    Except for `user_agent` apps, you can't clone one when the
                    remix copies an approved template version.
                  additionalProperties:
                    type: object
                    required:
                      - type
                    properties:
                      type:
                        type: string
                        enum:
                          - value
                          - clone
                        description: >-
                          `value` to set the secret to `value`, or `clone` to
                          copy a secret from the source app.
                        example: value
                      value:
                        type: string
                        description: >-
                          The secret's value when `type` is `value`. When `type`
                          is `clone`, the name of the source app's secret to
                          copy, which defaults to the key.
                        example: sk_test_example
                  example:
                    STRIPE_API_KEY:
                      type: value
                      value: sk_test_example
                    SENDGRID_API_KEY:
                      type: clone
            example:
              secret_values:
                STRIPE_API_KEY:
                  type: value
                  value: sk_test_example
      responses:
        '200':
          description: The new app.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserApp'
        '400':
          description: >-
            You can't remix the app, its type can't be remixed, you set
            `with_chat_history` without owning the app, collaborating on it as
            an editor, or administering its workspace (or on a public template
            from another workspace), or a `secret_values` entry is malformed,
            clones a secret while the remix copies an approved template version
            of an app that isn't a `user_agent` app, or clones a secret from a
            template in another workspace
            (`cross_workspace_secret_clone_not_allowed`).
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            Your token is read-only, the app is blocked (`app_blocked`), the app
            is a paid template you haven't bought, your role, plan, or account
            doesn't let you create another app of this type in the workspace,
            Superagent is disabled in the workspace for a `user_agent` app, or a
            `secret_values` entry clones a secret from an app you don't own.
        '404':
          description: >-
            The app doesn't exist, is outside the workspace or apps your token
            is scoped to and isn't an approved public template, or a secret that
            a `secret_values` entry clones doesn't exist on it.
        '409':
          description: >-
            The app's connected GitHub repository can't be reached. Its owner
            has to reconnect GitHub.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limit exceeded (10 requests per minute).
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    UserApp:
      properties:
        id:
          type: string
          title: Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: Time the app was created, as a UTC timestamp in ISO 8601 format.
          example: '2026-08-01T09:15:00'
        updated_date:
          type: string
          format: date-time
          title: Updated Date
          description: >-
            Time the app document was last written, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00'
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By
          description: Email of the user who created the app.
          example: developer@example.com
        organization_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Organization Id
          description: ID of the workspace the app belongs to.
          example: 67e0b12c4d8a3f005b21c9e4
        app_type:
          type: string
          title: App Type
          description: >-
            Kind of app, set when it's created. One of `user_app` (a web app),
            `user_agent` (an AI agent), `mobile_app` (a native mobile app),
            `user_game` (a game), `slide` (a presentation), or `imported_app`
            (an app imported from an existing code repository). List apps
            returns it as stored, so an older agent app can report `agent`
            instead of `user_agent`, and some older apps don't include it. Get
            app always returns one of the values above.
          default: user_app
          example: user_app
        name:
          type: string
          title: Name
          description: Display name of the app.
          default: untitled
          example: My CRM
        user_description:
          anyOf:
            - type: string
            - type: 'null'
          title: User Description
          description: >-
            Description of the app, or `null` if none was set. An app created
            without a `name` gets a generated description once a build turn
            changes it.
          example: A CRM to track leads and deals
        logo_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Logo Url
          description: >-
            URL of the app's logo, or `null` if it has none. Set it with [Set
            app logo](/api-reference/set-app-logo) or [Generate app
            logo](/api-reference/generate-app-logo).
          example: >-
            https://storage.base44.com/6820f3a4e7b91d003c45a1f2/3f2504e0_logo.png
        social_image_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Social Image Url
          description: >-
            URL of the image shown when the app is shared on social platforms,
            or `null` if none was set, in which case the logo is shown instead.
            Set it with [Set social image](/api-reference/set-social-image).
          example: >-
            https://storage.base44.com/6820f3a4e7b91d003c45a1f2/7c9e6679_social.png
        public_settings:
          type: string
          enum:
            - private_with_login
            - public_with_login
            - public_without_login
            - workspace_with_login
          title: Public Settings
          description: >-
            Who can open the published app. Each value is described under
            [Update app](/api-reference/update-app), which also changes it.
          default: public_with_login
          example: public_with_login
        auth_config:
          $ref: '#/components/schemas/AuthConfiguration'
          description: >-
            Which login methods the app's login page offers. If the workspace
            enforces SSO for apps, the login page offers only SSO, whatever
            these are set to. Change them with [Update
            app](/api-reference/update-app).
        hide_entity_created_by:
          type: boolean
          title: Hide Entity Created By
          description: >-
            Whether the app's entity records leave out the email of the user who
            created each one (`created_by`). Newer apps always leave the email
            out, whatever this is set to.
          default: false
          example: true
        is_remixable:
          type: boolean
          title: Is Remixable
          description: >-
            Whether others can remix the app. While it's `true`, the published
            app also shows the Base44 badge if `public_settings` is
            `public_with_login` or `public_without_login`.
          default: false
          example: false
        main_branch_protected:
          type: boolean
          title: Main Branch Protected
          description: >-
            Whether the app's main branch is protected, so changes to main must
            go through a branch that's merged back. Always `true` for imported
            apps. Change it with [Set main branch
            protection](/api-reference/set-main-branch-protection).
          default: false
          example: false
        slug:
          anyOf:
            - type: string
            - type: 'null'
          title: Slug
          description: >-
            URL slug for the app, auto generated from the name and app ID or set
            to a custom value, or `null` if the app has no slug yet. The
            published URL is built from it.
          example: my-crm-3c45a1f2
        is_unpublished:
          type: boolean
          title: Is Unpublished
          description: >-
            Whether the app was taken offline with [Unpublish
            app](/api-reference/unpublish-app) and hasn't been published again
            since. While it's `true`, the published URL is offline and
            `last_deployed_at` still shows the last publish.
          default: false
          example: false
        last_deployed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Deployed At
          description: >-
            Time the app was last published, as a UTC timestamp in ISO 8601
            format, or `null` if it has never been published.
          example: '2026-08-02T14:30:00'
        screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Screenshot Url
          description: >-
            URL of a screenshot of the published app. Captured shortly after
            each publish, so it can briefly lag or be `null` right after
            publishing.
          example: https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png
        preview_screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Preview Screenshot Url
          description: >-
            URL of a preview screenshot taken before publishing, distinct from
            `screenshot_url`, or `null` if none has been captured.
          example: https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png
        owner_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Owner Id
          description: >-
            ID of the user who owns the app. It starts as the creator and
            changes when ownership is transferred.
          example: 6706af53b9c1e2004a37d85f
        status:
          $ref: '#/components/schemas/StatusObject'
          description: >-
            The app's current build status. Poll while a build is in progress to
            watch it finish. This tracks building, not publishing.
        dev_environment_enabled:
          type: boolean
          title: Dev Environment Enabled
          description: >-
            Whether test data is on, which gives the app a test database next to
            its live one.
          default: false
          example: false
      type: object
      title: UserApp
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    AuthConfiguration:
      properties:
        enable_username_password:
          type: boolean
          title: Enable Username Password
          description: Whether people can sign in to the app with an email and password.
          default: false
          example: true
        enable_google_login:
          type: boolean
          title: Enable Google Login
          description: Whether people can sign in to the app with a Google account.
          default: true
          example: true
        enable_microsoft_login:
          type: boolean
          title: Enable Microsoft Login
          description: Whether people can sign in to the app with a Microsoft account.
          default: false
          example: false
        enable_facebook_login:
          type: boolean
          title: Enable Facebook Login
          description: Whether people can sign in to the app with a Facebook account.
          default: false
          example: false
        enable_apple_login:
          type: boolean
          title: Enable Apple Login
          description: Whether people can sign in to the app with an Apple account.
          default: false
          example: false
      type: object
      title: AuthConfiguration
      description: Authentication configuration for user applications
    StatusObject:
      properties:
        state:
          type: string
          enum:
            - ready
            - processing
            - error
          title: State
          description: >-
            Where the app is in its build lifecycle. Ready means idle with no
            build in progress, processing means the app is being generated or
            modified, and error means the last build failed. This tracks
            building, not publishing.
          example: ready
        details:
          anyOf:
            - type: string
            - type: 'null'
          title: Details
          description: >-
            Human readable note about the current state, such as what is being
            processed or why it failed, or `null` when there is nothing to
            report.
          example: Publishing app
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: >-
            ID of the request that last changed the status, or `null` if the
            status has never changed. Useful when reporting an issue.
          example: a1b2c3d4e5f67890abcdef12
        last_updated_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Updated Date
          description: >-
            Time the status was last updated, as a UTC timestamp in ISO 8601
            format.
          example: '2026-08-02T14:30:00Z'
        error_source:
          anyOf:
            - type: string
            - type: 'null'
          title: Error Source
          description: >-
            Where the failure originated when `state` is `error`, or `null`
            otherwise. A value of `paywall` means the work was blocked because
            the app's workspace has no credits left.
          example: build
        paywall_context:
          anyOf:
            - $ref: '#/components/schemas/PaywallStatusContext'
            - type: 'null'
          description: >-
            Present when the operation was blocked by a plan limit, describing
            what was evaluated, or `null` otherwise.
      type: object
      required:
        - state
      title: StatusObject
      description: The app's current build status.
    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
    PaywallStatusContext:
      properties:
        billing_organization_id:
          type: string
          title: Billing Organization Id
          description: ID of the billing organization the paywall was evaluated against.
          example: 67e0b12c4d8a3f005b21c9e4
        user_id:
          type: string
          title: User Id
          description: ID of the user the paywall was evaluated for.
          example: 6706af53b9c1e2004a37d85f
        evaluated_at:
          type: string
          format: date-time
          title: Evaluated At
          description: >-
            Time the paywall condition was evaluated, as a UTC timestamp in ISO
            8601 format.
          example: '2026-08-02T14:30:00Z'
      type: object
      required:
        - billing_organization_id
        - user_id
        - evaluated_at
      title: PaywallStatusContext
  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.