curl --request GET \
--url https://api.rankspot.ai/v1/ai-visibility/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.rankspot.ai/v1/ai-visibility/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.rankspot.ai/v1/ai-visibility/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://api.rankspot.ai/v1/ai-visibility/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 => [
"Authorization: Bearer <token>"
],
]);
$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://api.rankspot.ai/v1/ai-visibility/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.rankspot.ai/v1/ai-visibility/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rankspot.ai/v1/ai-visibility/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"startDate": "2026-07-01",
"endDate": "2026-07-28",
"visibilityScore": 42.9,
"shareOfVoice": 22.5,
"citationShare": 8.1,
"categoryRank": 3,
"responsesCounted": 112,
"platforms": {
"chatgpt": 66.7,
"perplexity": 25,
"google_ai_overview": null,
"google_ai_mode": 0
},
"leaderboard": [
{
"competitorId": "3f1c2b4e-8d5a-4a2f-9c3e-7b1d6a5e4c20",
"name": "RankSpot",
"domain": "rankspot.ai",
"isOwnBrand": true,
"mentions": 31,
"shareOfVoice": 27.7,
"position": 1,
"sentiment": 82
}
]
}Get AI visibility summary
How your brand did in AI answers over a period: four headline scores, the split across platforms, and the ten most-mentioned brands with yours among them.
Requires: startDate and endDate. Unlike the list endpoints, a summary reports on a bounded period.
Comparing periods: call it twice with two equal-length periods and compare the scores. Equal length matters — a 30-day period against a 7-day one measures the calendar, not your visibility.
Reading a null: every score is nullable and null means the period had no data to compute it from, which is not the same as zero. A workspace whose runs all failed scores null, not 0%. Check responsesCounted before quoting any of them.
What counts: runs that failed or never completed are excluded throughout, so a provider outage does not read as a period of poor visibility.
Your own row: shareOfVoice and categoryRank are your entry in leaderboard, lifted out. Your brand always appears there, even at zero mentions or outside the top ten.
curl --request GET \
--url https://api.rankspot.ai/v1/ai-visibility/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.rankspot.ai/v1/ai-visibility/summary"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.rankspot.ai/v1/ai-visibility/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://api.rankspot.ai/v1/ai-visibility/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 => [
"Authorization: Bearer <token>"
],
]);
$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://api.rankspot.ai/v1/ai-visibility/summary"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.rankspot.ai/v1/ai-visibility/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.rankspot.ai/v1/ai-visibility/summary")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"startDate": "2026-07-01",
"endDate": "2026-07-28",
"visibilityScore": 42.9,
"shareOfVoice": 22.5,
"citationShare": 8.1,
"categoryRank": 3,
"responsesCounted": 112,
"platforms": {
"chatgpt": 66.7,
"perplexity": 25,
"google_ai_overview": null,
"google_ai_mode": 0
},
"leaderboard": [
{
"competitorId": "3f1c2b4e-8d5a-4a2f-9c3e-7b1d6a5e4c20",
"name": "RankSpot",
"domain": "rankspot.ai",
"isOwnBrand": true,
"mentions": 31,
"shareOfVoice": 27.7,
"position": 1,
"sentiment": 82
}
]
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Inclusive start of the period, YYYY-MM-DD (UTC).
"2026-07-01"
Inclusive end of the period, YYYY-MM-DD (UTC).
"2026-07-28"
Response
"2026-07-01"
"2026-07-28"
Share of answers that named your brand, 0-100, as an unweighted mean of the per-platform scores. null when nothing ran in the period, which is not the same as 0.
42.9
Your mentions as a share of all brand mentions, 0-100. Your own row in leaderboard, lifted out. null when no brand was mentioned at all.
22.5
Citations pointing at your own domain as a share of all citations, 0-100.
8.1
Your 1-based position in leaderboard. null when the workspace has no own brand set.
3
Answers the scores are computed from. Read it before quoting the others: 100% visibility across two answers is not the same claim as 100% across two hundred.
112
Visibility per platform, 0-100. null means the platform produced no answer in the period; 0 means it answered and never named you. visibilityScore is the unweighted mean of the non-null entries.
Hide child attributes
Hide child attributes
{ "chatgpt": 66.7, "perplexity": 25, "google_ai_overview": null, "google_ai_mode": 0 }
The ten most-mentioned brands, most first, with your own always included even when it falls outside the ten or was never mentioned. Brands hidden in the dashboard are excluded, including from the share-of-voice denominator.
Hide child attributes
Hide child attributes
"3f1c2b4e-8d5a-4a2f-9c3e-7b1d6a5e4c20"
"RankSpot"
"rankspot.ai"
true
Times the answers named this brand.
31
This brand as a share of all mentions in the period, 0-100. Measured against every brand named, not only the ten returned, so the rows here need not sum to 100.
27.7
1-based, most mentioned first.
1
Mean of how favourably the answers spoke of this brand, 0-100. null when no answer carried a sentiment for it.
82
