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

# Push changes to GitHub

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

Pushes the app's latest saved version to the connected repository.

Base44 pushes each saved version by itself while automatic sync is on. Use this when a push failed, or when you've turned automatic sync off, since it pushes regardless of that setting.

The push commits the app's latest saved version on the main line, so it publishes saved work rather than the current chat [turn](/developers/references/app-management/get-started/concepts#turns), and it never pushes a Base44 branch.

A failed push is reported in the response body rather than as an error, so read `success` and `error`.

<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}/github/sync/manual
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/github/sync/manual:
    post:
      summary: Push changes to GitHub
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Pushes the app's latest saved version to the connected repository.


        Base44 pushes each saved version by itself while automatic sync is on.
        Use this when a push failed, or when you've turned automatic sync off,
        since it pushes regardless of that setting.


        The push commits the app's latest saved version on the main line, so it
        publishes saved work rather than the current chat
        [turn](/developers/references/app-management/get-started/concepts#turns),
        and it never pushes a Base44 branch.


        A failed push is reported in the response body rather than as an error,
        so read `success` and `error`.


        <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: trigger_manual_sync_api_apps__app_id__github_sync_manual_post
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose GitHub sync this affects.
            title: App Id
          description: ID of the app whose GitHub sync this affects.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: The outcome of the push.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GitHubPushResult'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have access to this app, or you used a workspace API key.
            These endpoints take a personal API key.
        '404':
          description: App not found.
components:
  schemas:
    GitHubPushResult:
      properties:
        success:
          type: boolean
          title: Success
          description: Whether the push succeeded.
          example: true
        commit_hash:
          anyOf:
            - type: string
            - type: 'null'
          title: Commit Hash
          description: Commit pushed to the repository, or `null` when nothing was pushed.
          example: 4c7e1f90ab3d5628e1a0f7b24c9d8e6350a1b2c4
        commits_pushed:
          type: boolean
          title: Commits Pushed
          description: >-
            Whether the push moved the repository forward. The value is `false`
            both when the repository already had this commit and when nothing
            was pushed at all.
          example: true
        skipped:
          type: boolean
          title: Skipped
          description: >-
            Whether the push was skipped. This is `true` for exactly one reason,
            which is that the connection carries no GitHub App installation.
            Every other reason nothing was pushed comes back `false`, including
            no connection at all and a connection in `error` or `revoked`, so
            read `error` rather than this flag.
          example: false
        error:
          anyOf:
            - type: string
            - type: 'null'
          title: Error
          description: >-
            Why the push didn't happen, or `null` when it succeeded. Plain text,
            not a code you can branch on.
          example: App not connected to GitHub
        duration_ms:
          anyOf:
            - type: integer
            - type: 'null'
          title: Duration Ms
          description: >-
            How long the push took, in milliseconds, or `null` when Base44
            rejected the request before starting one.
          example: 2860
      type: object
      required:
        - success
        - commits_pushed
        - skipped
      title: GitHubPushResult
      description: Outcome of a push to the connected repository.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````