> ## Documentation Index
> Fetch the complete documentation index at: https://docs.base44.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 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](/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>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json post /api/apps/{app_id}/app-checkpoints/{checkpoint_id}/load
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/app-checkpoints/{checkpoint_id}/load:
    post:
      summary: Restore checkpoint
      description: >-
        <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>
      operationId: >-
        load_checkpoint_api_api_apps__app_id__app_checkpoints__checkpoint_id__load_post
      parameters:
        - name: checkpoint_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              ID of the checkpoint, as returned in `id` by [List
              checkpoints](/api-reference/list-checkpoints).
            title: Checkpoint Id
          description: >-
            ID of the checkpoint, as returned in `id` by [List
            checkpoints](/api-reference/list-checkpoints).
          example: 6886b8d390dc7e2f4a2c91b3
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app.
            title: App Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
      responses:
        '200':
          description: The app, as restored to the checkpoint.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AppSummary'
        '401':
          description: Missing or invalid credentials.
        '403':
          description: >-
            You don't have access to this app, or you used a workspace API key.
            These endpoints take a personal API key.
        '404':
          description: App not found, or the app has no checkpoint with this ID.
        '409':
          description: >-
            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':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    AppSummary:
      properties:
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
          description: ID of the app.
          example: 6820f3a4e7b91d003c45a1f2
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: Display name of the app.
          example: My CRM
        slug:
          anyOf:
            - type: string
            - type: 'null'
          title: Slug
          description: >-
            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.
          example: my-crm-3c45a1f2
        user_description:
          anyOf:
            - type: string
            - type: 'null'
          title: User Description
          description: >-
            Description of the app, or `null` if none was set. On a newly
            created app this holds the original prompt text.
          example: A CRM to track leads and deals
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By
          description: Email of the user who created the app.
          example: developer@example.com
        created_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created Date
          description: Time the app was created.
          example: '2026-08-01T09:15:00'
        updated_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated Date
          description: Time the app document was last written.
          example: '2026-08-02T14:30:00'
        status:
          anyOf:
            - $ref: '#/components/schemas/AppStatusResponse'
            - type: 'null'
          description: >-
            The app's current build status. Poll while a build is in progress to
            watch it finish. This tracks building, not publishing.
        last_deployed_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Deployed At
          description: >-
            Time the app was last published, or `null` if it has never been
            published.
          example: '2026-08-02T14:30:00'
        screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Screenshot Url
          description: >-
            URL of a screenshot of the published app. Captured shortly after
            each publish, so it can briefly lag or be `null` right after
            publishing.
          example: https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png
        preview_screenshot_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Preview Screenshot Url
          description: >-
            URL of a preview screenshot taken before publishing, distinct from
            screenshot_url, and `null` if none has been captured.
          example: https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png
      type: object
      title: AppSummary
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    AppStatusResponse:
      properties:
        state:
          type: string
          enum:
            - ready
            - processing
            - error
          title: State
          description: >-
            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.
          example: ready
        details:
          anyOf:
            - type: string
            - type: 'null'
          title: Details
          description: >-
            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.
          example: Publishing app
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Request Id
          description: >-
            ID of the request that last changed the status, or `null` if the
            status has never changed. Useful when reporting an issue.
          example: a1b2c3d4e5f67890abcdef12
        last_updated_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Updated Date
          description: Time the status was last updated.
          example: '2026-08-02T14:30:00'
        error_source:
          anyOf:
            - type: string
            - type: 'null'
          title: Error Source
          description: >-
            Where the failure originated when the state is error, or `null`
            otherwise.
          example: build
        paywall_context:
          anyOf:
            - $ref: '#/components/schemas/PaywallStatusContextResponse'
            - type: 'null'
          description: >-
            Present when the operation was blocked by a plan limit, describing
            what was evaluated, or `null` otherwise.
      type: object
      required:
        - state
      title: AppStatusResponse
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    PaywallStatusContextResponse:
      properties:
        billing_organization_id:
          type: string
          title: Billing Organization Id
          description: ID of the billing organization the paywall was evaluated against.
          example: 6820f3a4e7b91d003c45a1f2
        user_id:
          type: string
          title: User Id
          description: ID of the user the paywall was evaluated for.
          example: 6820f3a4e7b91d003c45a1f3
        evaluated_at:
          type: string
          format: date-time
          title: Evaluated At
          description: Time the paywall condition was evaluated.
          example: '2026-08-02T14:30:00'
      type: object
      required:
        - billing_organization_id
        - user_id
        - evaluated_at
      title: PaywallStatusContextResponse
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````