curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/deploy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/deploy"
payload = {
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12"
}
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({
checkpoint_id: '6886b8d390dc7e2f4a2c91b3',
git_commit_hash: 'a1b2c3d4e5f67890abcdef1234567890abcdef12'
})
};
fetch('https://app.base44.com/api/apps/{app_id}/deploy', 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}/deploy",
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([
'checkpoint_id' => '6886b8d390dc7e2f4a2c91b3',
'git_commit_hash' => 'a1b2c3d4e5f67890abcdef1234567890abcdef12'
]),
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}/deploy"
payload := strings.NewReader("{\n \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\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}/deploy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/deploy")
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 \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "6820f3a4e7b91d003c45a1f2",
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12",
"deployed_at": "2026-08-02T14:30:00",
"app_url": "https://my-crm-3c45a1f2.base44.app"
}Deploy an app
Deploys your app to production, publishing your latest changes so they go live for its users. By default the app’s current version is deployed. To deploy a specific saved version instead, pass its ID in the request body. For an app whose source code you manage, pass the commit of a build uploaded with the Base44 CLI instead. Deploying works on main only, so naming a branch in branch_id returns a 409.
curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/deploy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12"
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/deploy"
payload = {
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12"
}
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({
checkpoint_id: '6886b8d390dc7e2f4a2c91b3',
git_commit_hash: 'a1b2c3d4e5f67890abcdef1234567890abcdef12'
})
};
fetch('https://app.base44.com/api/apps/{app_id}/deploy', 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}/deploy",
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([
'checkpoint_id' => '6886b8d390dc7e2f4a2c91b3',
'git_commit_hash' => 'a1b2c3d4e5f67890abcdef1234567890abcdef12'
]),
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}/deploy"
payload := strings.NewReader("{\n \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\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}/deploy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/deploy")
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 \"checkpoint_id\": \"6886b8d390dc7e2f4a2c91b3\",\n \"git_commit_hash\": \"a1b2c3d4e5f67890abcdef1234567890abcdef12\"\n}"
response = http.request(request)
puts response.read_body{
"app_id": "6820f3a4e7b91d003c45a1f2",
"checkpoint_id": "6886b8d390dc7e2f4a2c91b3",
"git_commit_hash": "a1b2c3d4e5f67890abcdef1234567890abcdef12",
"deployed_at": "2026-08-02T14:30:00",
"app_url": "https://my-crm-3c45a1f2.base44.app"
}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 to deploy.
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
ID of a specific saved version of the app to deploy. If omitted, the app's current version is deployed.
"6886b8d390dc7e2f4a2c91b3"
For an app whose source code you manage, the commit of a build already uploaded with the Base44 CLI. That build is deployed instead of a saved version. Cannot be combined with checkpoint_id.
^[a-fA-F0-9]{7,64}$"a1b2c3d4e5f67890abcdef1234567890abcdef12"
Response
Successful Response
The version of an app that was published, and when.
ID of the app that was deployed.
"6820f3a4e7b91d003c45a1f2"
ID of the saved version associated with this deploy, or null if the app has no saved versions. The git commit hash identifies the exact code that was deployed.
"6886b8d390dc7e2f4a2c91b3"
Git commit hash of the code that was deployed.
"a1b2c3d4e5f67890abcdef1234567890abcdef12"
Time the app was deployed, as a UTC timestamp in ISO 8601 format.
"2026-08-02T14:30:00"
Public URL the app is now served at, built from its slug, or null if the app has no slug yet. A custom domain the app is also served on isn't returned.
"https://my-crm-3c45a1f2.base44.app"
Was this page helpful?