curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/seo/settings \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"settings": {
"pages": {
"Home": {
"title": "Acme CRM",
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png"
}
},
"sitemap_xml_enabled": true
}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/settings"
payload = { "settings": {
"pages": { "Home": {
"title": "Acme CRM",
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png"
} },
"sitemap_xml_enabled": True
} }
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
settings: {
pages: {
Home: {
title: 'Acme CRM',
description: 'Track leads and deals in one place.',
og_image: 'https://cdn.example.com/acme-og.png'
}
},
sitemap_xml_enabled: true
}
})
};
fetch('https://app.base44.com/api/apps/{app_id}/seo/settings', 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/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'settings' => [
'pages' => [
'Home' => [
'title' => 'Acme CRM',
'description' => 'Track leads and deals in one place.',
'og_image' => 'https://cdn.example.com/acme-og.png'
]
],
'sitemap_xml_enabled' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/seo/settings"
payload := strings.NewReader("{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("api_key", "<api-key>")
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.put("https://app.base44.com/api/apps/{app_id}/seo/settings")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"seo_disabled": false,
"platform_meta_injection_enabled": true,
"platform_jsonld_injection_enabled": true,
"robots_txt_enabled": true,
"sitemap_xml_enabled": true,
"llms_txt_enabled": false,
"ai_crawlers_enabled": true,
"synthesized_breadcrumb_enabled": true,
"canonical_url": "https://acme.com",
"content_query_params": [
"article"
],
"custom_json_ld": [
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme CRM"
}
],
"website_schema": {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Acme CRM",
"url": "https://acme.com"
},
"organization_schema": {
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme",
"url": "https://acme.com"
},
"breadcrumb_schema": {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": []
},
"faq_schema": {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": []
},
"pages": {
"Home": {
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png",
"title": "Acme CRM"
}
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Update SEO settings
Saves SEO settings for the app and returns the settings as they now stand.
This is a partial update even though it is a PUT. Keys you leave out of settings keep their saved values, and pages merges twice over: a page you don’t mention keeps its overrides, and a field you don’t send on a page you do mention keeps its saved value. Sending one page’s title therefore leaves that page’s description and every other page untouched.
pages: {} changes nothing, and a null page entry is rejected with a 422. To stop a page overriding a tag, send an empty string as that field’s value.Saving is immediate, and the copy the live site serves is refreshed right after on a best-effort basis. A 200 means the settings are stored, so re-read them with Get SEO settings rather than treating the published pages as confirmation.
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 PUT \
--url https://app.base44.com/api/apps/{app_id}/seo/settings \
--header 'Content-Type: application/json' \
--header 'api_key: <api-key>' \
--data '
{
"settings": {
"pages": {
"Home": {
"title": "Acme CRM",
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png"
}
},
"sitemap_xml_enabled": true
}
}
'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/settings"
payload = { "settings": {
"pages": { "Home": {
"title": "Acme CRM",
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png"
} },
"sitemap_xml_enabled": True
} }
headers = {
"api_key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {api_key: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
settings: {
pages: {
Home: {
title: 'Acme CRM',
description: 'Track leads and deals in one place.',
og_image: 'https://cdn.example.com/acme-og.png'
}
},
sitemap_xml_enabled: true
}
})
};
fetch('https://app.base44.com/api/apps/{app_id}/seo/settings', 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/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'settings' => [
'pages' => [
'Home' => [
'title' => 'Acme CRM',
'description' => 'Track leads and deals in one place.',
'og_image' => 'https://cdn.example.com/acme-og.png'
]
],
'sitemap_xml_enabled' => true
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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"
"strings"
"net/http"
"io"
)
func main() {
url := "https://app.base44.com/api/apps/{app_id}/seo/settings"
payload := strings.NewReader("{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("api_key", "<api-key>")
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.put("https://app.base44.com/api/apps/{app_id}/seo/settings")
.header("api_key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["api_key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"settings\": {\n \"pages\": {\n \"Home\": {\n \"title\": \"Acme CRM\",\n \"description\": \"Track leads and deals in one place.\",\n \"og_image\": \"https://cdn.example.com/acme-og.png\"\n }\n },\n \"sitemap_xml_enabled\": true\n }\n}"
response = http.request(request)
puts response.read_body{
"result": {
"seo_disabled": false,
"platform_meta_injection_enabled": true,
"platform_jsonld_injection_enabled": true,
"robots_txt_enabled": true,
"sitemap_xml_enabled": true,
"llms_txt_enabled": false,
"ai_crawlers_enabled": true,
"synthesized_breadcrumb_enabled": true,
"canonical_url": "https://acme.com",
"content_query_params": [
"article"
],
"custom_json_ld": [
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme CRM"
}
],
"website_schema": {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "Acme CRM",
"url": "https://acme.com"
},
"organization_schema": {
"@context": "https://schema.org",
"@type": "Organization",
"name": "Acme",
"url": "https://acme.com"
},
"breadcrumb_schema": {
"@context": "https://schema.org",
"@type": "BreadcrumbList",
"itemListElement": []
},
"faq_schema": {
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": []
},
"pages": {
"Home": {
"description": "Track leads and deals in one place.",
"og_image": "https://cdn.example.com/acme-og.png",
"title": "Acme CRM"
}
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
Personal API key.
Path Parameters
ID of the app whose SEO settings you want.
Body
The settings to save. Send only the keys you want to change.
Show child attributes
Show child attributes
Response
The settings as they stand after the merge.
An app's SEO settings, wrapped in the field the endpoint returns them under.
The saved settings. This is an empty object for an app whose SEO settings have never been changed.
Show child attributes
Show child attributes
Was this page helpful?