curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/app-checkpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Manual Edits"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/app-checkpoints"
payload = { "name": "Manual Edits" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Manual Edits'})
};
fetch('https://app.base44.com/api/apps/{app_id}/app-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}/app-checkpoints",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Manual Edits'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/app-checkpoints"
payload := strings.NewReader("{\n \"name\": \"Manual Edits\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/app-checkpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Manual Edits\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/app-checkpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Manual Edits\"\n}"
response = http.request(request)
puts response.read_body{
"created": true,
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"reason": "no_changes"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Create checkpoint
Saves the app’s current state as a new checkpoint, so you can return to it later with Restore checkpoint.
A checkpoint records the app’s committed code, its entity schemas and its backend functions. Nothing is saved when the app has not changed since its most recent checkpoint: you get a 200 with created set to false and reason set to no_changes, and the checkpoint you already have stands.
Saving a checkpoint starts its preview build in the background. Poll List checkpoints and watch the new checkpoint’s preview_status to see when the preview is ready.
Set branch_id to work with a branch’s checkpoints instead of main’s. A branch has its own checkpoints and starts with none, so main’s checkpoints from before the branch was created aren’t included. A branch’s checkpoints can’t be deployed: Deploy an app works from main only. On a branch, a checkpoint records the branch’s code, and the “has not changed” check compares it with the branch’s own latest checkpoint, so a branch’s first checkpoint is always saved.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/app-checkpoints \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Manual Edits"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/app-checkpoints"
payload = { "name": "Manual Edits" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({name: 'Manual Edits'})
};
fetch('https://app.base44.com/api/apps/{app_id}/app-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}/app-checkpoints",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'Manual Edits'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/app-checkpoints"
payload := strings.NewReader("{\n \"name\": \"Manual Edits\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app.base44.com/api/apps/{app_id}/app-checkpoints")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"Manual Edits\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/app-checkpoints")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"Manual Edits\"\n}"
response = http.request(request)
puts response.read_body{
"created": true,
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"reason": "no_changes"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
Path Parameters
ID of the app.
Query Parameters
ID of the branch to work on, as returned by List branches. Omit it to work on the app's main branch.
Body
Name for the checkpoint, shown in the app's version history. Send a non-empty value: an empty string is not stored, and the checkpoint is named after the app's most recent chat message instead.
"Before pricing rework"
Response
Whether a checkpoint was saved, and its ID if one was.
Whether a checkpoint was saved. false means the app has not changed since its most recent checkpoint, so there was nothing to save.
true
ID of the checkpoint that was saved, or null when created is false. Pass it as checkpoint_id to Deploy an app to publish this version, or as checkpoint_id to Restore checkpoint to return to it.
"6886b8d390dc7e2f4a2c91b3"
Why nothing was saved. no_changes is the only value, and it is null when created is true.
"no_changes"
Was this page helpful?