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

# Import repository branch

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

Adds a branch that already exists in an imported app's GitHub repository as a [branch](/developers/references/app-management/get-started/concepts#branches) of the app, so you can work on it and open a pull request for it. Use [Create branch](/api-reference/create-branch) to start a new branch from main instead.

`branch_name` is the exact name of the branch in the repository, and it can't be the repository's default branch. The branch starts at the commit the repository's branch points to now. Its own preview starts the first time it's used.

For a public repository connected without GitHub access, a branch that exists can still be reported as not found.

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

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app, or a workspace API key, which acts as the workspace owner. A read-only key is refused.</Note> Send credentials in a header: an `api_key` query parameter is refused.

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


        Adds a branch that already exists in an imported app's GitHub repository
        as a
        [branch](/developers/references/app-management/get-started/concepts#branches)
        of the app, so you can work on it and open a pull request for it. Use
        [Create branch](/api-reference/create-branch) to start a new branch from
        main instead.


        `branch_name` is the exact name of the branch in the repository, and it
        can't be the repository's default branch. The branch starts at the
        commit the repository's branch points to now. Its own preview starts the
        first time it's used.


        For a public repository connected without GitHub access, a branch that
        exists can still be reported as not found.


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


        <Note>This endpoint accepts a personal API key belonging to a user with
        editor access to the app, or a workspace API key, which acts as the
        workspace owner. A read-only key is refused.</Note> Send credentials in
        a header: an `api_key` query parameter is refused.


        <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: import_branch_from_repo_api_apps__app_id__branches_import_from_repo_post
      parameters:
        - 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
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ImportRepoBranchRequest'
      responses:
        '200':
          description: The new branch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BranchSummary'
              example:
                id: 68f1a2b3c4d5e6f708192a3b
                app_id: 6820f3a4e7b91d003c45a1f2
                branch_name: feature/checkout
                status: active
                code_state: unchanged
                created_by_id: 68a0c1d2e3f4a5b6c7d8e9f0
                created_by_name: Jane Doe
                created_date: '2026-09-28T10:15:00'
        '400':
          description: '`branch_name` is the repository''s default branch.'
        '401':
          description: >-
            Missing or invalid credentials, or credentials sent as an `api_key`
            query parameter.
        '403':
          description: >-
            You don't have editor access to this app, the app is blocked, or
            your API key is read-only.
        '404':
          description: >-
            App not found, the app isn't an imported app, or the repository has
            no branch named `branch_name`.
        '409':
          description: >-
            An active or merged branch is already named `branch_name`, the app
            is busy with another change, or Base44 has no access to the
            repository (`github_access_missing`).
        '422':
          description: '`branch_name` is missing or over 255 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.
        '502':
          description: >-
            GitHub couldn't be reached or is limiting Base44's requests
            (`github_unavailable`). Nothing was changed; retry later.
      security:
        - PersonalAccessTokenAuth:
            - full_access
components:
  schemas:
    ImportRepoBranchRequest:
      properties:
        branch_name:
          type: string
          maxLength: 255
          minLength: 1
          title: Branch Name
          description: Exact name of the branch in the repository.
          example: feature/checkout
      type: object
      required:
        - branch_name
      title: ImportRepoBranchRequest
      description: |-
        Check out a branch that already exists in the repo (imported apps only).

        The name is the exact git ref. Git validates the name in the sandbox.
        We do not use ``is_legal_git_ref`` here — it refuses some names that a
        user's repo can have.
    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
        session_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Session Id
          description: >-
            ID of the [session](/api-reference/get-session) this branch belongs
            to, or `null` for a branch Base44 hasn't put in a session yet.
          example: 6820f3a4e7b91d003c45a1f9
        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
        - session_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>`. 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.