curl --request DELETE \
--url https://app.base44.com/api/apps/{app_id} \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}"
headers = {"api_key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"api_key: <api-key>"
],
]);
$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}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://app.base44.com/api/apps/{app_id}")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "6820f3a4e7b91d003c45a1f2",
"name": "My CRM",
"is_deleted": true,
"deleted_date": "2026-08-02T14:30:00",
"deleted_resources": [
"domains",
"integrations"
]
}Delete app
Moves the specified app to the trash. The live app goes offline right away and stops appearing in List apps.
You can delete an app you own. A workspace admin can delete any app in the workspace, and the owner is notified when they do. An editor who doesn’t own the app can’t delete it.
The app stays in the trash for 30 days. Restore it from Recently deleted in the Base44 dashboard within that window, because the API has no restore endpoint yet.
deleted_resources in the response to see what to set up again.Pause the app’s Google Ads campaigns before you delete it. While one is still serving, the delete is rejected rather than left spending on an app that’s gone.
The whole teardown runs before you get a response, so the call takes longer on an app with many connected resources. Retrying is safe. Deleting an app that’s already in the trash returns that app and changes nothing.
A delete that fails partway leaves the app live, so check the app before you retry. Some of its connected resources can already be released by then.
curl --request DELETE \
--url https://app.base44.com/api/apps/{app_id} \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}"
headers = {"api_key": "<api-key>"}
response = requests.delete(url, headers=headers)
print(response.text)const options = {method: 'DELETE', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}', 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}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "DELETE",
CURLOPT_HTTPHEADER => [
"api_key: <api-key>"
],
]);
$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}"
req, _ := http.NewRequest("DELETE", url, nil)
req.Header.Add("api_key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.delete("https://app.base44.com/api/apps/{app_id}")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Delete.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"id": "6820f3a4e7b91d003c45a1f2",
"name": "My CRM",
"is_deleted": true,
"deleted_date": "2026-08-02T14:30:00",
"deleted_resources": [
"domains",
"integrations"
]
}Authorizations
Personal API key.
Path Parameters
ID of the app to delete.
Response
The deleted app.
The app that moved to the trash.
ID of the deleted app.
"6820f3a4e7b91d003c45a1f2"
Display name of the deleted app.
"My CRM"
Whether the app is in the trash. Always true here, because the delete succeeded.
true
Time the app moved to the trash, as a UTC timestamp in ISO 8601 format. The 30 day restore window starts here. Deleting an app that is already in the trash reports the original deletion time.
"2026-08-02T14:30:00"
Kinds of connected resource this delete released for good, which restoring the app doesn't rebuild. Each value is one of domains, integrations, automations, redirects, workflows, templates, google_ads, plaid, folders, launchpad, agent_blobs, or partner_agent. The list is empty when the app had none of them.
["domains", "integrations"]
Was this page helpful?