---
title: "Push changes to GitHub"
method: POST
path: "/api/apps/{app_id}/github/sync/manual"
---

# Push changes to GitHub

`POST /api/apps/{app_id}/github/sync/manual`

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

## Path parameters

- `app_id` string, required — ID of the app whose GitHub sync this affects.

## Response `200`

The outcome of the push.

- GitHubPushResult — Outcome of a push to the connected repository.
  - `success` boolean, required — Whether the push succeeded.
  - `commit_hash` string, nullable — Commit pushed to the repository, or `null` when nothing was pushed.
  - `commits_pushed` boolean, required — 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.
  - `skipped` boolean, required — 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.
  - `error` string, nullable — Why the push didn't happen, or `null` when it succeeded. Plain text, not a code you can branch on.
  - `duration_ms` integer, nullable — How long the push took, in milliseconds, or `null` when Base44 rejected the request before starting one.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have access to this app, or you used a workspace API key. These endpoints take a personal API key.
- `404` — App not found.

---

[API](https://skmtc.dev/adexad/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/adexad/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/adexad/base44-app-management-api/revisions/6ad855bf424f/schema)
