---
title: "Create checkpoint"
method: POST
path: "/api/apps/{app_id}/app-checkpoints"
---

# Create checkpoint

`POST /api/apps/{app_id}/app-checkpoints`

<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 new [checkpoint](/developers/references/app-management/get-started/overview#checkpoints), so you can return to it later with [Restore checkpoint](/api-reference/restore-checkpoint).

A checkpoint records the app's committed code, its entity schemas and its backend functions. Nothing is saved when the app has not changed since its most recent checkpoint: you get a 200 with `created` set to `false` and `reason` set to `no_changes`, and the checkpoint you already have stands.

<Warning>That check is not a guarantee against duplicates. Two requests in flight at the same time can both find nothing changed and both save a checkpoint, so retrying before the first request has finished can leave you with two. Send one at a time, and read [List checkpoints](/api-reference/list-checkpoints) rather than retrying blind.</Warning>

Saving a checkpoint starts its preview build in the background. Poll [List checkpoints](/api-reference/list-checkpoints) and watch the new checkpoint's `preview_status` to see when the preview is ready.

<Note>This endpoint accepts a personal API key. Workspace API keys are not authorized for it and are rejected with a 403.</Note>

## Path parameters

- `app_id` string, required — ID of the app.

## Request body

- CreateManualCheckpointRequest
  - `name` string — Name for the checkpoint, shown in the app's version history. Send a non-empty value: an empty string is not stored, and the checkpoint is named after the app's most recent chat message instead.

## Response `200`

Whether a checkpoint was saved, and its ID if one was.

- ManualCheckpointResponse
  - `created` boolean, required — Whether a checkpoint was saved. `false` means the app has not changed since its most recent checkpoint, so there was nothing to save.
  - `checkpoint_id` string, nullable — ID of the checkpoint that was saved, or `null` when `created` is `false`. Pass it as `checkpoint_id` to [Deploy an app](/api-reference/deploy-an-app) to publish this version, or as `checkpoint_id` to [Restore checkpoint](/api-reference/restore-checkpoint) to return to it.
  - `reason` string, nullable — Why nothing was saved. `no_changes` is the only value, and it is `null` when `created` is `true`.

## Other responses

- `400` — The app has no committed code yet, so there is nothing to save.
- `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.
- `409` — The app's main line is protected, so its state can't be changed directly.
- `422` — Validation Error

---

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