---
title: "Create a sandbox checkpoint"
method: POST
path: "/api/apps/{app_id}/sandbox-bridge/create_checkpoint"
---

# Create a sandbox checkpoint

`POST /api/apps/{app_id}/sandbox-bridge/create_checkpoint`

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

Saves the app's current state as a checkpoint you can return to.

Every sandbox-bridge endpoint runs against the app's live sandbox, the same filesystem the Base44 builder edits, so a change here is visible in the builder immediately.

This is what makes sandbox work restorable. Writes through this API are committed to git but not checkpointed, and only checkpoints appear in the builder's version history: a Restore or Revert there rolls the app back to the last checkpoint and discards everything written after it. Take a checkpoint when you finish a unit of work and always before you stop, and one before a risky batch of edits so a bad change is one restore away. Pending writes are flushed first, so the checkpoint captures the sandbox as it stands.

Restore it with [Restore checkpoint](/api-reference/restore-checkpoint), and list what an app has with [List checkpoints](/api-reference/list-checkpoints). Checkpoints created here show up alongside the ones the builder takes.

This endpoint is limited to 60 requests per minute per app, shared with the other sandbox-bridge endpoints that change files.

<Note>The sandbox bridge needs a Builder plan or higher on the app's workspace, and answers 402 below that. Workspace API keys are not authorized and are rejected with a 403, and it is unavailable for agent apps. A personal API key works as-is. An OAuth access token needs the `sandbox:write` scope.</Note>

<Tip>Every error response carries a stable `extra_data.code` alongside the human-readable `message`. Branch on the code rather than on the message text or the status.</Tip>

## Path parameters

- `app_id` string, required — ID of the app whose sandbox to operate on.

## Request body

- object
  - `branch_id` string, nullable — Optional Base44 branch ID. Omit to operate on main.
  - `name` string, nullable — Optional message/title for the checkpoint. Defaults to an auto-generated title.

## Response `200`

The checkpoint that was created.

- CreateCheckpointResult — The checkpoint that was created.
  - `checkpoint_id` string, required — ID of the checkpoint. Pass it as `checkpoint_id` to [Restore checkpoint](/api-reference/restore-checkpoint) to come back to this state.
  - `name` string, required — The checkpoint's title, either the `name` you sent or one Base44 generated.
  - `git_commit_hash` string, nullable — The commit this checkpoint points at, or `null` when the app has no committed sandbox revision yet. A checkpoint without one still restores the app state Base44 captured.

## Other responses

- `401` — Missing or invalid credentials.
- `402` — The app's workspace plan doesn't include the sandbox bridge.
- `403` — You don't have access to this app, the app is blocked, your OAuth token is missing the scope this endpoint needs, or you used a workspace API key.
- `404` — App not found.
- `409` — The app is on a branch that can't be written to, or an earlier change is still being committed.
- `422` — Validation Error
- `429` — Rate limit exceeded (60 requests per minute).

## Changes

- **2026-09-15** `0e0a206b2f33` — 1 info
  - added the new optional request property `branch_id`
- **2026-09-07** `78b01bcee66e` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/base44/apis/base44-app-management-api/changes/api/apps/:app_id/sandbox-bridge/create_checkpoint/post.md)

---

[API](https://skmtc.dev/base44/apis/base44-app-management-api.md) · [All operations](https://skmtc.dev/base44/apis/base44-app-management-api/llms.txt) · [OpenAPI document](https://skmtc.dev/base44/apis/base44-app-management-api/revisions/cf164639a9bf?raw)
