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

# Merge branch

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

Merges an active branch into the app's main branch. Base44 merges the branch's code into main, applies its entity and backend function changes to main, saves a checkpoint, and adds a message to main's conversation that summarizes the merge. The branch's `status` then becomes `merged`, and it can't be changed after that. This works while [main branch protection](/api-reference/set-main-branch-protection) is on.

The request returns once the merge is done. A 409 leaves the branch active and main unchanged. Its `extra_data.reason` tells you what to do:

- `branch_has_no_changes`: the branch has no code changes to merge.
- `branch_merge_conflict`: the branch conflicts with main. [Update the branch from main](/api-reference/update-branch-from-main) to resolve the conflicts, then merge again.
- `app_processing` or `branch_processing`: the AI is working on main or on the branch. Try again once it's done.
- `branch_sync_in_progress`: the branch is being updated from main. Try again once [Get branch sync status](/api-reference/get-branch-sync-status) shows `sync_state` as `idle`.
- `branch_pending_commit_wait_failed`: the branch's latest changes are still being saved. Try again shortly.

In this response, `branch.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, merging it returns a 409 with `branch_has_no_changes`.</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.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/branches/{branch_id}/merge
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/{branch_id}/merge:
    post:
      summary: Merge branch
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Merges an active branch into the app's main branch. Base44 merges the
        branch's code into main, applies its entity and backend function changes
        to main, saves a checkpoint, and adds a message to main's conversation
        that summarizes the merge. The branch's `status` then becomes `merged`,
        and it can't be changed after that. This works while [main branch
        protection](/api-reference/set-main-branch-protection) is on.


        The request returns once the merge is done. A 409 leaves the branch
        active and main unchanged. Its `extra_data.reason` tells you what to do:


        - `branch_has_no_changes`: the branch has no code changes to merge.

        - `branch_merge_conflict`: the branch conflicts with main. [Update the
        branch from main](/api-reference/update-branch-from-main) to resolve the
        conflicts, then merge again.

        - `app_processing` or `branch_processing`: the AI is working on main or
        on the branch. Try again once it's done.

        - `branch_sync_in_progress`: the branch is being updated from main. Try
        again once [Get branch sync
        status](/api-reference/get-branch-sync-status) shows `sync_state` as
        `idle`.

        - `branch_pending_commit_wait_failed`: the branch's latest changes are
        still being saved. Try again shortly.


        In this response, `branch.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, merging it returns a 409 with
        `branch_has_no_changes`.</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.</Warning>
      operationId: merge_branch_api_apps__app_id__branches__branch_id__merge_post
      parameters:
        - name: branch_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              ID of the branch, as returned by [List
              branches](/api-reference/list-branches).
            title: Branch Id
          description: >-
            ID of the branch, as returned by [List
            branches](/api-reference/list-branches).
          example: 68f1a2b3c4d5e6f708192a3b
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app the branch belongs to.
            title: App Id
          description: ID of the app the branch belongs to.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: The merged branch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MergedBranch'
        '400':
          description: 'The branch isn''t active: it was already merged or deleted.'
        '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 the app has no branch with this ID.
        '409':
          description: >-
            The branch has no changes to merge, conflicts with main, or is busy.
            `extra_data.reason` says which.
        '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:
    MergedBranch:
      properties:
        branch:
          $ref: '#/components/schemas/BranchSummary'
          description: The branch, now with `status` set to `merged`.
        merge_message_id:
          type: string
          title: Merge Message Id
          description: >-
            ID of the message Base44 added to main's conversation to summarize
            the merge. Find it with [Read conversation
            messages](/api-reference/read-conversation-messages).
          example: 7f3a1c88-52d4-4a0e-9b31-2c6f0d8e4a19
      type: object
      required:
        - branch
        - merge_message_id
      title: MergedBranch
      description: The merged branch.
    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.