curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/remix \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"secret_values": {
"STRIPE_API_KEY": {
"type": "value",
"value": "sk_test_example"
}
}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/remix"
payload = { "secret_values": { "STRIPE_API_KEY": {
"type": "value",
"value": "sk_test_example"
} } }
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({secret_values: {STRIPE_API_KEY: {type: 'value', value: 'sk_test_example'}}})
};
fetch('https://app.base44.com/api/apps/{app_id}/remix', 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}/remix",
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([
'secret_values' => [
'STRIPE_API_KEY' => [
'type' => 'value',
'value' => 'sk_test_example'
]
]
]),
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}/remix"
payload := strings.NewReader("{\n \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\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/apps/{app_id}/remix")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/remix")
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 \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "6820f3a4e7b91d003c45a1f2",
"first_prompt_model_comparison": {
"id": "<string>",
"client_creation_id": "<string>",
"models": [
"<string>"
],
"status": "preparing"
},
"name": "My CRM",
"slug": "my-crm-3c45a1f2",
"user_description": "A CRM to track leads and deals",
"created_by": "developer@example.com",
"created_date": "2026-08-01T09:15:00",
"updated_date": "2026-08-02T14:30:00",
"status": {
"state": "ready",
"details": "Publishing app",
"request_id": "a1b2c3d4e5f67890abcdef12",
"last_updated_date": "2026-08-02T14:30:00Z",
"error_source": "build",
"paywall_context": {
"billing_organization_id": "67e0b12c4d8a3f005b21c9e4",
"user_id": "6706af53b9c1e2004a37d85f",
"evaluated_at": "2026-08-02T14:30:00Z"
}
},
"last_deployed_at": "2026-08-02T14:30:00",
"screenshot_url": "https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png",
"preview_screenshot_url": "https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Remix an app
Creates a copy of an app in your workspace and makes you its owner. The app must be in the workspace your personal access token is scoped to, and the remix is created there too, so you need an editor-capable role in it. You can remix an app you own, collaborate on as an editor, or administer as a workspace admin, an approved template, or an app its owner marked as remixable and didn’t make private. Remixing a paid template requires that you bought it first. Call Get remix requirements first to see which secrets the app needs.
The remix is named after the app with (Copy) appended. When the app is an approved template, the remix copies the approved version of the template, name included, rather than the app’s current state, unless you set with_chat_history.
The body takes only the fields below. Fields that Create app accepts, such as name, user_description, public_settings, custom_instructions, and prevent_iframe_embedding, are ignored here. The remix copies user_description, public_settings, and custom_instructions from the app and starts with prevent_iframe_embedding set to true. Rename the remix or change its description afterwards with Update app. The API has no endpoint for changing the other settings yet.
The response returns as soon as the new app exists. Setting up its files can continue in the background, so poll Get app until its status.state is no longer processing. A token limited to selected apps doesn’t gain access to the new app, so use a token with access to all apps in the workspace if you need to reach the remix afterwards. This endpoint is limited to 10 requests per minute.
secret_values are applied and before the code is copied. A request that fails at either step, for example on an invalid secret_values entry, still leaves the new app in your workspace, and it counts toward your plan’s app limit. Delete it before you retry.curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/remix \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"secret_values": {
"STRIPE_API_KEY": {
"type": "value",
"value": "sk_test_example"
}
}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/remix"
payload = { "secret_values": { "STRIPE_API_KEY": {
"type": "value",
"value": "sk_test_example"
} } }
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({secret_values: {STRIPE_API_KEY: {type: 'value', value: 'sk_test_example'}}})
};
fetch('https://app.base44.com/api/apps/{app_id}/remix', 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}/remix",
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([
'secret_values' => [
'STRIPE_API_KEY' => [
'type' => 'value',
'value' => 'sk_test_example'
]
]
]),
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}/remix"
payload := strings.NewReader("{\n \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\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/apps/{app_id}/remix")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/remix")
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 \"secret_values\": {\n \"STRIPE_API_KEY\": {\n \"type\": \"value\",\n \"value\": \"sk_test_example\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "6820f3a4e7b91d003c45a1f2",
"first_prompt_model_comparison": {
"id": "<string>",
"client_creation_id": "<string>",
"models": [
"<string>"
],
"status": "preparing"
},
"name": "My CRM",
"slug": "my-crm-3c45a1f2",
"user_description": "A CRM to track leads and deals",
"created_by": "developer@example.com",
"created_date": "2026-08-01T09:15:00",
"updated_date": "2026-08-02T14:30:00",
"status": {
"state": "ready",
"details": "Publishing app",
"request_id": "a1b2c3d4e5f67890abcdef12",
"last_updated_date": "2026-08-02T14:30:00Z",
"error_source": "build",
"paywall_context": {
"billing_organization_id": "67e0b12c4d8a3f005b21c9e4",
"user_id": "6706af53b9c1e2004a37d85f",
"evaluated_at": "2026-08-02T14:30:00Z"
}
},
"last_deployed_at": "2026-08-02T14:30:00",
"screenshot_url": "https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png",
"preview_screenshot_url": "https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Headers
Language to return generated text in, as a standard Accept-Language value. An unsupported language falls back to English.
Path Parameters
ID of the app to remix.
Body
Whether to copy the app's chat history too. The remix then copies the app's current state, even when the app is an approved template. Only the app's owner, its editor-level collaborators, and its workspace admins can set it.
false
Secrets to set on the remix, keyed by secret name. Set type to value to provide the secret's value. Set type to clone to copy the value of a secret on the source app, named by value or, when you omit value, by the key itself. You can clone a secret only from an app you own. Except for user_agent apps, you can't clone one when the remix copies an approved template version.
Show child attributes
Show child attributes
{
"STRIPE_API_KEY": {
"type": "value",
"value": "sk_test_example"
},
"SENDGRID_API_KEY": { "type": "clone" }
}
Response
The new app.
An app in a workspace, limited to the properties the caller requested.
ID of the app.
"6820f3a4e7b91d003c45a1f2"
Accepted first-prompt model comparison, including its durable comparison ID.
Show child attributes
Show child attributes
Display name of the app.
"My CRM"
URL slug for the app, auto generated from the name and app ID or set to a custom value, or null if the app has no slug yet. The published URL is built from it.
"my-crm-3c45a1f2"
Description of the app, or null if none was set. An app created without a name gets a generated description once a build turn changes it.
"A CRM to track leads and deals"
Email of the user who created the app.
"developer@example.com"
Time the app was created, as a UTC timestamp in ISO 8601 format.
"2026-08-01T09:15:00"
Time the app document was last written, as a UTC timestamp in ISO 8601 format.
"2026-08-02T14:30:00"
The app's current build status. Poll while a build is in progress to watch it finish. This tracks building, not publishing.
Show child attributes
Show child attributes
Time the app was last published, as a UTC timestamp in ISO 8601 format, or null if it has never been published.
"2026-08-02T14:30:00"
URL of a screenshot of the published app. Captured shortly after each publish, so it can briefly lag or be null right after publishing.
"https://storage.base44.com/screenshots/6820f3a4e7b91d003c45a1f2.png"
URL of a preview screenshot taken before publishing, distinct from screenshot_url, or null if none has been captured.
"https://storage.base44.com/previews/6820f3a4e7b91d003c45a1f2.png"
Was this page helpful?