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

# Update branch from main

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

Brings main's latest changes into an active branch. When main's code changed, Base44 merges it into the branch. Messages sent on main since the branch was created or last updated are added to the branch's conversation as context for the AI. When nothing changed on main, nothing happens and `updated` is `false`.

If main's changes conflict with the branch's, the AI resolves the conflicts on the branch before the request returns. That's an AI turn: it uses credits like a chat message, and the request can stay open for several minutes. If the AI needs your input to finish, `sync_status.sync_state` is `needs_input`. The branch then stays locked until you answer in the Base44 editor, and it can't be updated, merged, or deleted until then. If the AI can't resolve the conflicts, the request fails and the branch is restored to how it was before the update.

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

This endpoint is limited to 10 requests per minute.

<Tip>A 409 response carries an `extra_data.reason` code that says why the request was refused.</Tip>

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


        Brings main's latest changes into an active branch. When main's code
        changed, Base44 merges it into the branch. Messages sent on main since
        the branch was created or last updated are added to the branch's
        conversation as context for the AI. When nothing changed on main,
        nothing happens and `updated` is `false`.


        If main's changes conflict with the branch's, the AI resolves the
        conflicts on the branch before the request returns. That's an AI turn:
        it uses credits like a chat message, and the request can stay open for
        several minutes. If the AI needs your input to finish,
        `sync_status.sync_state` is `needs_input`. The branch then stays locked
        until you answer in the Base44 editor, and it can't be updated, merged,
        or deleted until then. If the AI can't resolve the conflicts, the
        request fails and the branch is restored to how it was before the
        update.


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


        This endpoint is limited to 10 requests per minute.


        <Tip>A 409 response carries an `extra_data.reason` code that says why
        the request was refused.</Tip>


        <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: >-
        sync_branch_from_main_api_apps__app_id__branches__branch_id__sync_from_main_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 branch after the update.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchSyncResult'
        '400':
          description: >-
            The update needs the AI to resolve conflicts, and you've run out of
            credits.
        '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 active branch with this ID.
        '409':
          description: >-
            The branch can't be updated right now. `extra_data.reason` is
            `app_processing` or `branch_processing` while the AI is working on
            main or on the branch, `branch_sync_in_progress` while another
            update runs or waits for input, and `branch_sync_branch_moved` when
            the branch changed during the update. Any other reason means recent
            changes are still being saved. Try again shortly.
        '429':
          description: >-
            Rate limit exceeded. The base limit is 10 requests per minute. See
            [Rate
            limits](/developers/references/apps-api/get-started/rate-limits) for
            the multiplier your plan gets.
components:
  schemas:
    BranchSyncResult:
      properties:
        branch:
          $ref: '#/components/schemas/BranchSummary'
          description: The branch after the update.
        sync_status:
          $ref: '#/components/schemas/BranchSyncStatus'
          description: How the branch stands against main after the update.
        updated:
          type: boolean
          title: Updated
          description: >-
            `false` when the branch was already up to date with main, so nothing
            changed. `true` when the update was applied, or when it's waiting
            for your input (`sync_status.sync_state` is `needs_input`).
          example: true
      type: object
      required:
        - branch
        - sync_status
        - updated
      title: BranchSyncResult
      description: The branch after the update.
    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.
    BranchSyncStatus:
      properties:
        new_main_message_count:
          type: integer
          title: New Main Message Count
          description: >-
            How many chat messages people sent on main since the branch was
            created or last updated from main.
          example: 2
        main_code_changed:
          type: boolean
          title: Main Code Changed
          description: >-
            `true` when main's code changed since the branch was created or last
            updated from main.
          example: true
        conflict_state:
          type: string
          enum:
            - clear
            - overlap
            - unavailable
          title: Conflict State
          description: >-
            Whether updating the branch from main is expected to conflict.
            `clear` when main's code hasn't changed, so an update can't
            conflict. `overlap` when the update is expected to conflict, or
            while conflicts from an update are being resolved. `unavailable`
            when Base44 can't tell, including while an update runs. Once main's
            code has changed, it's never `clear`, even when the update would
            apply cleanly.
          example: unavailable
        sync_state:
          type: string
          enum:
            - idle
            - updating
            - resolving
            - needs_input
          title: Sync State
          description: >-
            `idle` when no update is running. `updating` while main's changes
            are being applied, `resolving` while the AI resolves conflicts, and
            `needs_input` when the AI needs an answer to finish resolving them.
            Answer it in the Base44 editor. Until the state is back to `idle`,
            the branch can't be merged or deleted.
          example: idle
        blocked_reason:
          anyOf:
            - type: string
              enum:
                - app_processing
                - branch_processing
            - type: 'null'
          title: Blocked Reason
          description: >-
            Why [Update branch from
            main](/api-reference/update-branch-from-main) would be refused right
            now: `app_processing` while the AI is working on main, and
            `branch_processing` while it's working on the branch. `null` when
            neither applies. An update is also refused while `sync_state` is
            `resolving` or `needs_input`.
          example: app_processing
      type: object
      required:
        - new_main_message_count
        - main_code_changed
        - conflict_state
        - sync_state
        - blocked_reason
      title: BranchSyncStatus
      description: How the branch stands against main.
    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.