curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/seo/settings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--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 = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', '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 => [
"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/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("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.put("https://app.base44.com/api/apps/{app_id}/seo/settings")
.header("Authorization", "Bearer <token>")
.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["Authorization"] = 'Bearer <token>'
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": [
{
"confidence": "0.85",
"entity_name": "Product",
"field_mapping": {
"name": "title"
},
"json_ld_template": {
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme CRM"
},
"schema_type": "Product"
}
],
"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"
}
}
}
}Update SEO settings
Saves SEO settings for the app and returns the settings as they now stand.
This is a partial update. Keys you leave out of settings keep their saved values. The same is true one level deeper for pages. A page absent from your pages object keeps its existing overrides, and within a page you do include, any field you leave out keeps its saved value. For example, sending only a page’s title changes that field alone. Its description and every other page stay as they were. To hide or show a single page, Update page SEO settings changes just its noindex without sending the rest of the settings.
You can’t remove a page or a page override through this endpoint. An empty pages object changes nothing, and a null page entry is rejected. To stop a page overriding a tag, send an empty string as that field’s value instead.
A successful call means the settings are saved. The live site can take a little while to catch up, so confirm with Get SEO settings rather than treating the published pages as proof.
curl --request PUT \
--url https://app.base44.com/api/apps/{app_id}/seo/settings \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--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 = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', '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 => [
"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/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("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.put("https://app.base44.com/api/apps/{app_id}/seo/settings")
.header("Authorization", "Bearer <token>")
.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["Authorization"] = 'Bearer <token>'
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": [
{
"confidence": "0.85",
"entity_name": "Product",
"field_mapping": {
"name": "title"
},
"json_ld_template": {
"@context": "https://schema.org",
"@type": "Product",
"name": "Acme CRM"
},
"schema_type": "Product"
}
],
"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"
}
}
}
}Authorizations
Personal access token, sent as Authorization: Bearer <token>. Each operation lists the permission it needs: read_only or full_access. A full-access token can call every operation. A read-only token can call only the operations that list read_only; anything else returns 403 read_only_credential_route_not_allowed.
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.
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?