curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/seo/fix \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fix_type": "enable_llms_txt",
"params": {}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/fix"
payload = {
"fix_type": "enable_llms_txt",
"params": {}
}
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({fix_type: 'enable_llms_txt', params: {}})
};
fetch('https://app.base44.com/api/apps/{app_id}/seo/fix', 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}/seo/fix",
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([
'fix_type' => 'enable_llms_txt',
'params' => [
]
]),
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}/seo/fix"
payload := strings.NewReader("{\n \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\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}/seo/fix")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/fix")
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 \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\n}"
response = http.request(request)
puts response.read_body{
"result": {
"success": true,
"message": "llms.txt enabled",
"redirect": "domains"
}
}Apply SEO fix
Applies the fix for one check from an SEO scan and returns what it did.
Get the checks from Run SEO scan or Get last SEO scan. Each check Base44 can act on carries a fix_action. Send its type as fix_type and its params as params.
These actions change the app’s SEO settings. Each one replaces the value it sets, including a value someone edited by hand:
enable_llms_txtturns on the generated/llms.txt.enable_ai_crawlersallows known AI crawlers in the generatedrobots.txt.generate_json_ldreplacescustom_json_ldwith markup generated from the app’s entities.generate_page_metareplaces the title and description of every page except the home page. Each page keeps itsnoindexandog_imagevalues.generate_website_schema,generate_organization_schemaandgenerate_faq_schemareplace the saved WebSite, Organization and FAQPage markup.generate_breadcrumb_schematurns onsynthesized_breadcrumb_enabledand deletes the savedbreadcrumb_schema.generate_canonicalsetscanonical_urlto the app’s current URL.
These actions change the app itself:
generate_descriptionreplaces the app’s description with one an AI model writes from the app’s name, pages and entities. When the model’s answer doesn’t pass Base44’s length and wording checks, Base44 saves a description built from a template instead.suggest_shorter_titleshortens an app name longer than 60 characters to 57 or fewer, cutting at a word boundary. A name of 60 characters or fewer is left as it is.
The rest change nothing. set_app_title, edit_app_description, edit_public_access, open_seo_advanced, set_og_image, connect_domain, edit_slug, enable_https and publish_app return a redirect naming the builder screen where the app’s owner makes the fix. fix_with_ai marks a check that needs a change to the app’s code, which the builder makes by sending the action’s params.prompt to the app’s AI chat.
No action edits the app’s code, creates a checkpoint or uses the workspace’s credits.
A call can succeed and still report success as false when the action had nothing to apply, such as generate_json_ld on an app with no entity Base44 can match to a Schema.org type.
Calling an action again applies it again. Most land on the same result every time, but generate_description writes a new description on each call.
Saving itself is immediate. The live site is served from a separate copy, which is updated right after, but that update isn’t guaranteed to happen in the same moment and can lag. A successful call means the change is stored, not that the live site has caught up.
This is limited to 30 requests a minute per caller for each app, shared with the app’s other SEO endpoints. Some workspaces have a different limit.
fix_type values documented here. Other values are not supported and their behavior can change.curl --request POST \
--url https://app.base44.com/api/apps/{app_id}/seo/fix \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"fix_type": "enable_llms_txt",
"params": {}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/fix"
payload = {
"fix_type": "enable_llms_txt",
"params": {}
}
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({fix_type: 'enable_llms_txt', params: {}})
};
fetch('https://app.base44.com/api/apps/{app_id}/seo/fix', 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}/seo/fix",
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([
'fix_type' => 'enable_llms_txt',
'params' => [
]
]),
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}/seo/fix"
payload := strings.NewReader("{\n \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\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}/seo/fix")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/fix")
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 \"fix_type\": \"enable_llms_txt\",\n \"params\": {}\n}"
response = http.request(request)
puts response.read_body{
"result": {
"success": true,
"message": "llms.txt enabled",
"redirect": "domains"
}
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app to fix.
Body
Action to apply, the type of a check's fix_action in Get last SEO scan.
enable_llms_txt, enable_ai_crawlers, generate_json_ld, generate_page_meta, generate_website_schema, generate_organization_schema, generate_faq_schema, generate_breadcrumb_schema, generate_canonical, generate_description, suggest_shorter_title, set_app_title, edit_app_description, edit_public_access, open_seo_advanced, set_og_image, connect_domain, edit_slug, enable_https, publish_app, fix_with_ai "enable_llms_txt"
Arguments for the action, the params of the same fix_action, sent as they are. Defaults to an empty object.
{}
Response
What the action did.
The outcome of a fix action.
What the action did.
Show child attributes
Show child attributes
Was this page helpful?