Restore checkpoint

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

post/api/apps/{app_id}/app-checkpoints/{checkpoint_id}/load

Path parameters

checkpoint_idstring required

ID of the checkpoint, as returned in id by List checkpoints.

ID of the checkpoint, as returned in id by List checkpoints.

app_idstring required

ID of the app.

ID of the app.

Response

The app, as restored to the checkpoint.

idstring nullable

ID of the app.

namestring nullable

Display name of the app.

slugstring 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_descriptionstring nullable

Description of the app, or null if none was set. On a newly created app this holds the original prompt text.

created_bystring nullable

Email of the user who created the app.

created_datestring date-time nullable

Time the app was created.

updated_datestring date-time nullable

Time the app document was last written.

last_deployed_atstring date-time nullable

Time the app was last published, or null if it has never been published.

screenshot_urlstring 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_urlstring nullable

URL of a preview screenshot taken before publishing, distinct from screenshot_url, and null if none has been captured.

Example response

{
  "id": "6820f3a4e7b91d003c45a1f2",
  "name": "My CRM",
  "slug": "my-crm-3c45a1f2",
  "user_description": "A CRM to track leads and deals",
  "created_by": "developer@example.com",
  "created_date": "2026-08-01T09:15:00",
  "updated_date": "2026-08-02T14:30:00",
  "status": {
    "state": "ready",
    "details": "Publishing app",
    "request_id": "a1b2c3d4e5f67890abcdef12",
    "last_updated_date": "2026-08-02T14:30:00",
    "error_source": "build",
    "paywall_context": {
      "billing_organization_id": "6820f3a4e7b91d003c45a1f2",
      "user_id": "6820f3a4e7b91d003c45a1f3",
      "evaluated_at": "2026-08-02T14:30:00"
    }
  },
  "last_deployed_at": "2026-08-02T14:30:00",
  "screenshot_url": "https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png",
  "preview_screenshot_url": "https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png"
}

Changes