curl --request POST \
--url https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"metadata": {
"version": "1.1.0",
"changelog": "Adds a reports page."
}
}
'import requests
url = "https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update"
payload = { "metadata": {
"version": "1.1.0",
"changelog": "Adds a reports page."
} }
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({metadata: {version: '1.1.0', changelog: 'Adds a reports page.'}})
};
fetch('https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update', 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/app-catalog-items/catalog/{item_id}/submit-update",
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([
'metadata' => [
'version' => '1.1.0',
'changelog' => 'Adds a reports page.'
]
]),
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/app-catalog-items/catalog/{item_id}/submit-update"
payload := strings.NewReader("{\n \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\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/app-catalog-items/catalog/{item_id}/submit-update")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update")
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 \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "68b2f0c1a4d9e7001c3b5a22",
"app_id": "6820f3a4e7b91d003c45a1f2",
"name": "CRM starter",
"status": "approved",
"visibility_scope": "workspace",
"pending_metadata": {
"version": "1.1.0"
},
"_update_info": {
"has_code_changes": true,
"has_metadata_changes": false,
"auto_approved": true
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}Submit template listing update
Sends the app’s current state, and optionally new listing details, as an update to its approved template listing. It’s the Submit update button in the app’s template settings.
The update copies the app as it is in the editor, including changes you haven’t published. Publishing with Deploy an app doesn’t change what goes in.
What happens next depends on the listing:
- A workspace template updates right away.
- A public template goes to Base44 for review. The current version stays live until the update is approved. Submitting again replaces an update that’s still waiting, including its listing details.
Only an approved listing that isn’t archived can be updated. An app that uses a custom connector can’t be submitted, because a custom connector works only in the workspace that built it. Get it from catalog_items in Check app delete impact.
Submitting an update is limited to 10 requests a minute per caller.
curl --request POST \
--url https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"metadata": {
"version": "1.1.0",
"changelog": "Adds a reports page."
}
}
'import requests
url = "https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update"
payload = { "metadata": {
"version": "1.1.0",
"changelog": "Adds a reports page."
} }
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({metadata: {version: '1.1.0', changelog: 'Adds a reports page.'}})
};
fetch('https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update', 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/app-catalog-items/catalog/{item_id}/submit-update",
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([
'metadata' => [
'version' => '1.1.0',
'changelog' => 'Adds a reports page.'
]
]),
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/app-catalog-items/catalog/{item_id}/submit-update"
payload := strings.NewReader("{\n \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\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/app-catalog-items/catalog/{item_id}/submit-update")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/app-catalog-items/catalog/{item_id}/submit-update")
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 \"metadata\": {\n \"version\": \"1.1.0\",\n \"changelog\": \"Adds a reports page.\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "68b2f0c1a4d9e7001c3b5a22",
"app_id": "6820f3a4e7b91d003c45a1f2",
"name": "CRM starter",
"status": "approved",
"visibility_scope": "workspace",
"pending_metadata": {
"version": "1.1.0"
},
"_update_info": {
"has_code_changes": true,
"has_metadata_changes": false,
"auto_approved": true
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}{
"error": {
"code": "database_unavailable",
"message": "Database temporarily unavailable, please retry",
"details": {}
}
}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.
Scopes
Path Parameters
ID of the template listing to update. Get it from catalog_items in Check app delete impact.
Body
Response
The update was submitted.
The template listing after the update was submitted.
Was this page helpful?