---
title: "List branches"
method: GET
path: "/api/apps/{app_id}/branches"
---

# List branches

`GET /api/apps/{app_id}/branches`

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

Returns the app's [branches](/developers/references/app-management/get-started/concepts#branches), newest first. Branches imported with [Import a GitHub branch](/api-reference/import-a-github-branch) are included. While [main branch protection](/api-reference/set-main-branch-protection) is on, changes to main go through a branch.

By default only active branches are returned. Set `include_merged` to `true` to also get the ones already merged into main. Deleted branches are never listed, but [Get branch](/api-reference/get-branch) still returns them. The list isn't paginated.

This is limited to 300 requests per minute per app for each workspace's personal API keys, so every key in a workspace shares one allowance. List branches and Get branch share it. Some workspaces have a different limit.

<Note>This endpoint accepts a personal API key belonging to a user with editor access to the app, including a read-only key. 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>

## Path parameters

- `app_id` string, required — ID of the app whose branches to read.

## Query parameters

- `include_merged` boolean — Set to `true` to also return branches already merged into main.

## Response `200`

The app's branches, newest first.

- BranchSummary[] — The app's branches.
  - `id` string, required — ID of the branch.
  - `app_id` string, required — ID of the app the branch belongs to.
  - `branch_name` string, required — Name of the branch.
  - `status` 'active' | 'merged' | 'deleted', required — `active` while the branch can still be worked on, `merged` once it was merged into main, and `deleted` once it was deleted.
  - `run_state` BranchRunState, required
    - `state` 'ready' | 'processing' | 'error', required — `processing` while the AI is working on the branch, `ready` once it's idle, and `error` when the last turn on the branch failed.
    - `details` string, nullable, required — Short note about the state, such as why the last turn failed, or `null` when there's nothing to report.
    - `last_updated_date` string, date-time, required — When the state last changed, as a UTC timestamp in ISO 8601 format.
  - `code_state` 'unchanged' | 'changed', required — `unchanged` when the branch has no code changes of its own to merge into main. `changed` otherwise, including when Base44 can't tell yet.
  - `base_checkpoint_id` string, nullable, required — ID of the main [checkpoint](/api-reference/list-checkpoints) the branch started from, or `null` if the app had no checkpoint yet.
  - `created_by_id` string, required — ID of the user who created the branch.
  - `created_by_name` string, nullable, required — 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.
  - `created_date` string, date-time, required — When the branch was created, as a UTC timestamp in ISO 8601 format.
  - `merged_at` string, date-time, nullable, required — When the branch was merged into main, as a UTC timestamp in ISO 8601 format, or `null` if it wasn't.
  - `merged_by_id` string, nullable, required — 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.
  - `static_preview_url` string, required — URL of the branch's preview. It shows the branch only while it's active and once it has been built.

## Other responses

- `401` — Missing or invalid credentials.
- `403` — You don't have editor access to this app, the app is blocked, or you used a workspace API key.
- `404` — App not found.
- `422` — `include_merged` isn't a boolean.
- `429` — Rate limit exceeded. The base limit is 300 requests per minute. See [Rate limits](/developers/references/apps-api/get-started/rate-limits) for the multiplier your plan gets.

## Changes

> 26 revisions in range; 1 not diffed.

- **2026-10-06** `9a0e9d0827a1` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/adexad/apis/base44-app-management-api/changes/api/apps/:app_id/branches/get.md)

---

[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.dev/adexad/apis/base44-app-management-api/revisions/9a0e9d0827a1?raw)
