curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/seo/summary \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/summary"
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/summary', 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/summary",
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/summary"
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/summary")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/summary")
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": {
"overall": 82,
"grade": "B",
"scanned_at": "2026-09-03T09:15:00+00:00",
"failures": 2,
"warnings": 3
}
}Get SEO score
Returns the score from the app’s last SEO scan, without the checks behind it.
This is the cheap read: five numbers off the app’s stored settings, with no live fetch and no scan. It returns null until the app is scanned at least once, so run Run SEO scan first. Use Get last SEO scan when you need the individual checks.
failures and warnings count the checks in that scan, so they agree both with the checklist Get last SEO scan returns and with the per-category counts inside it. Only score is weighted.
This score is stored separately from the checklist, so compare scanned_at with the one Get last SEO scan returns before reading the two together. Two scans running at once can leave the pair on different scans until the next scan settles them.
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/summary \
--header 'api_key: <api-key>'import requests
url = "https://app.base44.com/api/apps/{app_id}/seo/summary"
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/summary', 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/summary",
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/summary"
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/summary")
.header("api_key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/seo/summary")
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": {
"overall": 82,
"grade": "B",
"scanned_at": "2026-09-03T09:15:00+00:00",
"failures": 2,
"warnings": 3
}
}Authorizations
Personal API key.
Path Parameters
ID of the app.
Response
The last scan's score, or null if the app has never been scanned.
The score rollup, wrapped in the field the endpoint returns it under.
The last scan's score, or null if the app has never been scanned.
Show child attributes
Show child attributes
Was this page helpful?