curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"fields": [
"amount",
"status",
"customer_email",
"id",
"created_date",
"updated_date",
"created_by_id",
"created_by",
"is_sample"
],
"records": [
{
"amount": 4200,
"created_by": "jane@acme.com",
"created_by_id": "6874b0c2e1a94d0031bb77de",
"created_date": "2026-06-01T09:23:41.481000",
"customer_email": "jane@acme.com",
"id": "6886b8d390dc7e2f4a2c91b3",
"is_sample": false,
"status": "draft",
"updated_date": "2026-06-01T09:23:41.481000"
}
]
}Download data checkpoint
Returns every record one entity held at a checkpoint, as it was just before the change that created the checkpoint.
The response is the entity’s whole table in one piece, with no paging. fields lists its columns at the time, so you can write records out as a CSV file with the header the entity had then. Row-level security doesn’t apply, and the records are always production data.
Downloading changes nothing. To put the records back, use Restore data to checkpoint.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/{entity_name}/versions/checkpoints/{checkpoint_id}/snapshot")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"fields": [
"amount",
"status",
"customer_email",
"id",
"created_date",
"updated_date",
"created_by_id",
"created_by",
"is_sample"
],
"records": [
{
"amount": 4200,
"created_by": "jane@acme.com",
"created_by_id": "6874b0c2e1a94d0031bb77de",
"created_date": "2026-06-01T09:23:41.481000",
"customer_email": "jane@acme.com",
"id": "6886b8d390dc7e2f4a2c91b3",
"is_sample": false,
"status": "draft",
"updated_date": "2026-06-01T09:23:41.481000"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the checkpoint, as checkpoint_id from List data checkpoints.
ID of the app.
Name of the entity, exactly as List entity schemas reports it. Don't pass User here. It doesn't fail, but it reads and writes a separate, disconnected set of records stored under that name, not the app's real user accounts, which are managed through their own endpoints.
Response
The entity's records at the checkpoint.
An entity's records as they stood at a checkpoint.
The entity's columns at the checkpoint, in order. That's the fields its schema declared then, followed by the fields Base44 adds to every record. Use them as the header row when you write records to a CSV file.
[
"amount",
"status",
"customer_email",
"id",
"created_date",
"updated_date",
"created_by_id",
"created_by",
"is_sample"
]
Every record the entity held at the checkpoint, in the same shape as List entity records returns them.
[
{
"amount": 4200,
"created_by": "jane@acme.com",
"created_by_id": "6874b0c2e1a94d0031bb77de",
"created_date": "2026-06-01T09:23:41.481000",
"customer_email": "jane@acme.com",
"id": "6886b8d390dc7e2f4a2c91b3",
"is_sample": false,
"status": "draft",
"updated_date": "2026-06-01T09:23:41.481000"
}
]
Was this page helpful?