curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints"
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/versions/checkpoints', 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/versions/checkpoints",
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/versions/checkpoints"
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/versions/checkpoints")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints")
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{
"items": [
{
"checkpoint_id": "68a1c2d3e4f5a6b7c8d9e0f1",
"data_as_of": "2026-06-04T14:07:02.115000Z",
"entity_name": "Invoice",
"trigger_type": "crud"
}
],
"next_cursor": "gAAAAABn7vJ..."
}List data checkpoints
Returns the points in the app’s entity data history that you can download or restore to, newest first.
Base44 adds one when an entity’s records change (at most one every 5 minutes for each entity), when its schema changes, and just before a restore rewrites it. The list covers every entity in the app unless you name some with entity_name, and only reaches back as far as retention_days from Get data version history status.
Results use cursor-based pagination. Pass next_cursor from one response as cursor on the next request, and keep the same filters.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints"
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/versions/checkpoints', 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/versions/checkpoints",
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/versions/checkpoints"
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/versions/checkpoints")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/entities/versions/checkpoints")
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{
"items": [
{
"checkpoint_id": "68a1c2d3e4f5a6b7c8d9e0f1",
"data_as_of": "2026-06-04T14:07:02.115000Z",
"entity_name": "Invoice",
"trigger_type": "crud"
}
],
"next_cursor": "gAAAAABn7vJ..."
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app.
Query Parameters
Entity to list checkpoints for. Repeat it to list several, as in ?entity_name=Invoice&entity_name=Customer, up to 200. Leave it out to list every entity's checkpoints. A name the app has no entity for matches nothing rather than failing.
Pagination cursor from previous response.
Items per page. Max 200. Defaults to 50, and a larger value is treated as 200.
Earliest data_as_of to include, as an ISO 8601 timestamp such as 2026-06-01T00:00:00Z. A timestamp with no offset is read as UTC.
Only include checkpoints whose data_as_of is before this moment, as an ISO 8601 timestamp such as 2026-06-08T00:00:00Z. A timestamp with no offset is read as UTC.
Response
One page of checkpoints.
One page of an app's version-history checkpoints, newest first.
The page's checkpoints, newest first.
Show child attributes
Show child attributes
[
{
"checkpoint_id": "68a1c2d3e4f5a6b7c8d9e0f1",
"data_as_of": "2026-06-04T14:07:02.115000Z",
"entity_name": "Invoice",
"trigger_type": "crud"
}
]
Cursor for fetching the next page. The value is null if there are no more pages. A full page always carries one, so the page after it can come back empty.
"gAAAAABn7vJ..."
Was this page helpful?