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

# Restore checkpoint

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

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

Returns the app to a saved [checkpoint](/developers/references/app-management/get-started/overview#checkpoints) and answers with the restored app.

Restoring rolls the app's code back to the checkpoint's commit, redeploys its backend functions from that code, restores the entity schemas the checkpoint saved, and rewinds the app's chat history to the point the checkpoint was taken.

<Note>A 200 does not confirm that every backend function redeployed. A function whose deployment fails is recorded and skipped rather than failing the restore, so an app that depends on its functions is worth checking afterwards.</Note>

<Warning>The chat messages after the checkpoint are dropped from the conversation and do not come back. The code does come back: a restore deletes no checkpoints, so every version stays in [List checkpoints](/api-reference/list-checkpoints) and restoring a later one returns the code you rolled back from.</Warning>

The work happens while you wait, and there is a lot of it: a code rollback, a redeploy per backend function, and a schema sync. Allow for that in your client's timeout. The app's `status` is `processing` for the duration and `ready` once the restore finishes, so if your request times out, poll [Get app](/api-reference/get-app) instead of sending this again.

Restoring the checkpoint the app is already on is not a no-op. There is no shortcut for that case: the rollback, the redeploy and the sync all run again.

<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

- `checkpoint_id` string, required — ID of the checkpoint, as returned in `id` by [List checkpoints](/api-reference/list-checkpoints).
- `app_id` string, required — ID of the app.

## Response `200`

The app, as restored to the checkpoint.

- AppSummary
  - `id` string, nullable — ID of the app.
  - `name` string, nullable — Display name of the app.
  - `slug` string, nullable — URL slug for the app, auto generated from the name and app ID or set to a custom value, or `null` if the app has no slug yet. The published URL is built from it.
  - `user_description` string, nullable — Description of the app, or `null` if none was set. On a newly created app this holds the original prompt text.
  - `created_by` string, nullable — Email of the user who created the app.
  - `created_date` string, date-time, nullable — Time the app was created.
  - `updated_date` string, date-time, nullable — Time the app document was last written.
  - `status` AppStatusResponse
    - `state` 'ready' | 'processing' | 'error', required — Where the app is in its build lifecycle. Ready means idle with no build in progress, processing means the app is being generated or modified, and error means the last build failed. This tracks building, not publishing.
    - `details` string, nullable — Human readable note about the current state, such as what is being processed or why it failed, or `null` when there is nothing to report.
    - `request_id` string, nullable — ID of the request that last changed the status, or `null` if the status has never changed. Useful when reporting an issue.
    - `last_updated_date` string, date-time, nullable — Time the status was last updated.
    - `error_source` string, nullable — Where the failure originated when the state is error, or `null` otherwise.
    - `paywall_context` PaywallStatusContextResponse
      - `billing_organization_id` string, required — ID of the billing organization the paywall was evaluated against.
      - `user_id` string, required — ID of the user the paywall was evaluated for.
      - `evaluated_at` string, date-time, required — Time the paywall condition was evaluated.
  - `last_deployed_at` string, date-time, nullable — Time the app was last published, or `null` if it has never been published.
  - `screenshot_url` string, nullable — URL of a screenshot of the published app. Captured shortly after each publish, so it can briefly lag or be `null` right after publishing.
  - `preview_screenshot_url` string, nullable — URL of a preview screenshot taken before publishing, distinct from screenshot_url, and `null` if none has been captured.

## 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, or the app has no checkpoint with this ID.
- `409` — The app's main line is protected, or the checkpoint belongs to a different line of the app's history than the one you're restoring into.
- `422` — Validation Error

## Changes

- **2026-08-27** `31ef75eb64ab` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/idealspot/apis/base44-app-management-api/changes/api/apps/:app_id/app-checkpoints/:checkpoint_id/load/post.md)

---

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