curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt', 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/preview/llms-txt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/seo/preview/llms-txt"
req, _ := http.NewRequest("GET", 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.get("https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"result": {
"content": "# Acme CRM\n\n> Track leads and deals in one place.\n\n## Pages\n\n- [Home](https://acme-crm.base44.app/): Main page\n- [Pricing](https://acme-crm.base44.app/pricing): Pricing page\n"
}
}Preview llms.txt
Returns the llms.txt Base44 generates for the app, so you can see it before publishing it.
llms.txt is a plain-text summary of the app for AI crawlers. This endpoint generates it fresh from the app’s current name, description and pages every time you call it, so the content tracks the app rather than anything saved.
Nothing here publishes it, and setting llms_txt_enabled on the app’s SEO settings is not enough on its own. Two things decide what /llms.txt answers, in this order.
First, the app has to be published and search-eligible. Base44 counts an app as search-eligible when it’s public. A private or workspace app never is, and an app that requires a login qualifies only where Base44 has turned search indexing on for it. Fail either and the path 404s whatever your settings say. Search-eligibility is also what decides whether a scan reports on llms.txt at all, so a scan of a private app leaves that check out while a scan of an unpublished public one still reports it, even though the path 404s for now.
Past that, llms_txt_enabled and seo_disabled only choose which file the app serves. With the toggle off, or SEO disabled, Base44 falls back to an llms.txt you deployed with the app yourself and 404s only when there isn’t one, so neither setting removes a file of your own.
This endpoint is limited to 30 requests per minute per app, and that budget is shared with the app’s other SEO endpoints.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt"
headers = {"api_key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {api_key: '<api-key>'}};
fetch('https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt', 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/preview/llms-txt",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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}/seo/preview/llms-txt"
req, _ := http.NewRequest("GET", 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.get("https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/preview/llms-txt")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["api_key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"result": {
"content": "# Acme CRM\n\n> Track leads and deals in one place.\n\n## Pages\n\n- [Home](https://acme-crm.base44.app/): Main page\n- [Pricing](https://acme-crm.base44.app/pricing): Pricing page\n"
}
}Was this page helpful?