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

> ## Agent Instructions
> Internal links on these pages omit the .md extension. Append .md to a docs page URL, or send an Accept: text/markdown header, to get that page as markdown.

# Create branch

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

Creates a [branch](/developers/references/app-management/get-started/concepts#branches) of the app from its main branch. The branch has its own copy of the app's code, so its changes don't reach main until you [merge the branch](/api-reference/merge-branch).

Set `branch_name` to name the branch, or send `prompt` and Base44 generates a short name from it. `prompt` only names the branch. It isn't sent to the AI. When a generated name is taken, Base44 adds a number to it. A `branch_name` you choose must not belong to another active or merged branch.

The branch starts from main's latest saved state. If the AI is working on main at the time, the branch starts from main as it was before that change. Set `from_message_id` to start from an earlier point instead. Send at least one of `branch_name`, `prompt`, and `from_message_id`.

In this response, `created_by_name` is always `null`. [Get branch](/api-reference/get-branch) returns it.

This endpoint is limited to 30 requests per minute, shared with Create branch, Delete branch and Merge branch.

<Note>You can't send chat messages to a branch through the API yet, so a branch gets changes of its own only from work in the Base44 editor. Until it has some, [Merge branch](/api-reference/merge-branch) refuses it with a 409.</Note>

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app. A read-only key is refused, and workspace API keys are not accepted.</Note>

<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}/branches
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}/branches:
    post:
      summary: Create branch
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Creates a
        [branch](/developers/references/app-management/get-started/concepts#branches)
        of the app from its main branch. The branch has its own copy of the
        app's code, so its changes don't reach main until you [merge the
        branch](/api-reference/merge-branch).


        Set `branch_name` to name the branch, or send `prompt` and Base44
        generates a short name from it. `prompt` only names the branch. It isn't
        sent to the AI. When a generated name is taken, Base44 adds a number to
        it. A `branch_name` you choose must not belong to another active or
        merged branch.


        The branch starts from main's latest saved state. If the AI is working
        on main at the time, the branch starts from main as it was before that
        change. Set `from_message_id` to start from an earlier point instead.
        Send at least one of `branch_name`, `prompt`, and `from_message_id`.


        In this response, `created_by_name` is always `null`. [Get
        branch](/api-reference/get-branch) returns it.


        This endpoint is limited to 30 requests per minute, shared with Create
        branch, Delete branch and Merge branch.


        <Note>You can't send chat messages to a branch through the API yet, so a
        branch gets changes of its own only from work in the Base44 editor.
        Until it has some, [Merge branch](/api-reference/merge-branch) refuses
        it with a 409.</Note>


        <Note>This endpoint accepts a personal API key belonging to a user with
        editor access to the app. A read-only key is refused, and workspace API
        keys are not accepted.</Note>


        <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: create_branch_api_apps__app_id__branches_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app to create the branch in.
            title: App Id
          description: ID of the app to create the branch in.
          example: 6820f3a4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateBranchRequest'
      responses:
        '200':
          description: The new branch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchSummary'
        '400':
          description: >-
            `branch_name` is `main`, or you set `from_message_id` on an app
            imported from GitHub, or the message's saved version belongs to a
            branch rather than main.
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have editor access to this app, the app is blocked, your
            API key is read-only, or you used a workspace API key.
        '404':
          description: >-
            App not found, or `from_message_id` isn't in main's conversation or
            has no saved version to start from.
        '409':
          description: An active or merged branch is already named `branch_name`.
        '422':
          description: >-
            None of `branch_name`, `prompt`, and `from_message_id` is set,
            `branch_name` breaks the naming rules or is over 100 characters, or
            `from_message_id` is over 64 characters.
        '429':
          description: >-
            Rate limit exceeded. The base limit is 30 requests per minute. See
            [Rate
            limits](/developers/references/apps-api/get-started/rate-limits) for
            the multiplier your plan gets.
components:
  schemas:
    CreateBranchRequest:
      properties:
        branch_name:
          anyOf:
            - type: string
              maxLength: 100
              minLength: 1
            - type: 'null'
          title: Branch Name
          description: >-
            Name of the branch. It starts with a letter or digit and contains
            only letters, digits, `.`, `_`, `/` and `-`. It can't contain `..`
            or `//`, end with `/` or `.`, start with `b44/`, or be `main`, and
            no part between slashes can start with `.` or end with `.lock`.
            Leave it out to have Base44 name the branch from `prompt`.
          example: add-contact-form
        prompt:
          anyOf:
            - type: string
            - type: 'null'
          title: Prompt
          description: >-
            Text to name the branch from when you leave out `branch_name`.
            Base44 generates a short name from it. An empty string names the
            branch after your first name and today's date.
          example: Add a contact form to the home page
        from_message_id:
          anyOf:
            - type: string
              maxLength: 64
            - type: 'null'
          title: From Message Id
          description: >-
            ID of a message in main's conversation, from [Read conversation
            messages](/api-reference/read-conversation-messages). The branch
            starts from the app as it was when that message was sent, instead of
            from main's latest state. Without `branch_name`, the branch is named
            after the last user message before that one, and `prompt` is
            ignored.
          example: 7f3a1c88-52d4-4a0e-9b31-2c6f0d8e4a19
      type: object
      title: CreateBranchRequest
      description: The new branch's name, or text to name it from.
    BranchSummary:
      properties:
        id:
          type: string
          title: Id
          description: ID of the branch.
          example: 68f1a2b3c4d5e6f708192a3b
        app_id:
          type: string
          title: App Id
          description: ID of the app the branch belongs to.
          example: 6820f3a4e7b91d003c45a1f2
        branch_name:
          type: string
          title: Branch Name
          description: Name of the branch.
          example: add-contact-form
        status:
          type: string
          enum:
            - active
            - merged
            - deleted
          title: Status
          description: >-
            `active` while the branch can still be worked on, `merged` once it
            was merged into main, and `deleted` once it was deleted.
          example: active
        run_state:
          anyOf:
            - $ref: '#/components/schemas/BranchRunState'
            - type: 'null'
          description: >-
            State of the AI's work on the branch, or `null` if no turn has run
            on it yet.
        code_state:
          type: string
          enum:
            - unchanged
            - changed
          title: Code State
          description: >-
            `unchanged` when the branch has no code changes of its own to merge
            into main. `changed` otherwise, including when Base44 can't tell
            yet.
          example: changed
        base_checkpoint_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Base Checkpoint Id
          description: >-
            ID of the main [checkpoint](/api-reference/list-checkpoints) the
            branch started from, or `null` if the app had no checkpoint yet.
          example: 6886b8d390dc7e2f4a2c91b3
        created_by_id:
          type: string
          title: Created By Id
          description: ID of the user who created the branch.
          example: 68a0c1d2e3f4a5b6c7d8e9f0
        created_by_name:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By Name
          description: >-
            Display name of the user who created the branch, or the part of
            their email before the `@` when they have no name. `null` when
            Base44 can't name them, for example when their account no longer
            exists.
          example: Jane Doe
        created_date:
          type: string
          format: date-time
          title: Created Date
          description: When the branch was created, as a UTC timestamp in ISO 8601 format.
          example: '2026-09-28T10:15:00'
        merged_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Merged At
          description: >-
            When the branch was merged into main, as a UTC timestamp in ISO 8601
            format, or `null` if it wasn't.
          example: '2026-09-29T08:02:11'
        merged_by_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Merged By Id
          description: >-
            ID of the user who merged the branch, or `null` if it wasn't merged
            or Base44 doesn't know who did, as for a branch whose pull request
            was merged on GitHub.
          example: 68a0c1d2e3f4a5b6c7d8e9f0
        static_preview_url:
          type: string
          title: Static Preview Url
          description: >-
            URL of the branch's preview. It shows the branch only while it's
            active and once it has been built.
          example: https://preview--6820f3a4e7b91d003c45a1f2--b-d8c647b.base44.app
      type: object
      required:
        - id
        - app_id
        - branch_name
        - status
        - run_state
        - code_state
        - base_checkpoint_id
        - created_by_id
        - created_by_name
        - created_date
        - merged_at
        - merged_by_id
        - static_preview_url
      title: BranchSummary
      description: A branch of an app.
    BranchRunState:
      properties:
        state:
          type: string
          enum:
            - ready
            - processing
            - error
          title: State
          description: >-
            `processing` while the AI is working on the branch, `ready` once
            it's idle, and `error` when the last turn on the branch failed.
          example: ready
        details:
          anyOf:
            - type: string
            - type: 'null'
          title: Details
          description: >-
            Short note about the state, such as why the last turn failed, or
            `null` when there's nothing to report.
          example: Restoring checkpoint
        last_updated_date:
          type: string
          format: date-time
          title: Last Updated Date
          description: When the state last changed, as a UTC timestamp in ISO 8601 format.
          example: '2026-09-28T10:18:40'
      type: object
      required:
        - state
        - details
        - last_updated_date
      title: BranchRunState
  securitySchemes:
    PersonalAccessTokenAuth:
      type: http
      scheme: bearer
      description: 'Personal access token, sent as `Authorization: Bearer <token>`.'

````

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