curl --request GET \
--url https://api.snowseo.com/v3/ai-tracker/visibility/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/visibility/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/ai-tracker/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{
"meta": {
"totalPrompts": 123,
"activePrompts": 123,
"activeRegionRuns": 123,
"totalResponses": 123,
"teamInfo": {},
"appliedFilters": {}
},
"summaryCards": {
"totalPrompts": {},
"activePrompts": {},
"totalResponses": {}
},
"cards": {
"visibility": {},
"shareOfVoice": {},
"citations": {},
"sentiment": {}
},
"sentimentEvidenceSummary": {
"classifiedMentions": 123,
"trackedPrompts": 123,
"providers": 123
}
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}AI Visibility
See how your brand shows up across AI assistants - visibility, citations, competitors, and sentiment.
curl --request GET \
--url https://api.snowseo.com/v3/ai-tracker/visibility/summary \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/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.snowseo.com/v3/ai-tracker/visibility/summary")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/ai-tracker/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{
"meta": {
"totalPrompts": 123,
"activePrompts": 123,
"activeRegionRuns": 123,
"totalResponses": 123,
"teamInfo": {},
"appliedFilters": {}
},
"summaryCards": {
"totalPrompts": {},
"activePrompts": {},
"totalResponses": {}
},
"cards": {
"visibility": {},
"shareOfVoice": {},
"citations": {},
"sentiment": {}
},
"sentimentEvidenceSummary": {
"classifiedMentions": 123,
"trackedPrompts": 123,
"providers": 123
}
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}platform, competitor, country, startDate/endDate or days, promptBrand, tracking, intent) and return a meta object describing the team, the resolved window, and how many prompts and responses are behind the numbers. Omitting the date parameters gives you the last 30 days (see Date Windows). Send endDate without startDate for All Time: the series starts at the first answer and no previous-period comparison is returned. Detail and lookup endpoints (/v3/ai-tracker/visibility/prompts/{id}, /v3/ai-tracker/visibility/prompts?fields=minimal, /v3/ai-tracker/filter-options, /v3/ai-models) take fewer parameters and may omit meta; /v3/ai-tracker/visibility/brands/{name}, /v3/ai-tracker/visibility/citation-source, and /v3/ai-tracker/visibility/cited-subreddits take the scope filters but do not return meta.
Pick the narrowest endpoint that answers your question - /v3/ai-tracker/visibility/summary is a few kilobytes, /v3/ai-tracker/visibility/overview grows with window length times tracked brands.
Responses carry data only: percentages are numbers from 0 to 100, and there are no display colors, avatar initials or pre-formatted strings. Source and page types come as type keys (for example commercial).
Previous-period comparison values are off by default on every endpoint that can produce them. They roughly double a time series and only a chart drawing a dotted comparison line reads them, so pass includePrevious=true when you need them. The scalar change fields are always included.
Summary
Headline numbers with daily sparklines and a change against the previous window: visibility, share of voice, citation share, and sentiment.More endpoints
- Overview
- Trends
- Brands
- Brand Detail
- Competitors
- Citations
- Citation Source
- Cited Subreddits
- Platforms
- Sentiment
- Prompts
- Prompt Detail
- Filter Options
- Models
Authorizations
Your SnowSEO API key (sk_...).
Query Parameters
Comma-separated AI platform names, or 'All Platforms' for no filter.
Comma-separated competitor names, or 'All Competitors' for no filter. Keeps prompts where ANY listed competitor appears.
Comma-separated ISO2 country codes, or 'All Countries' for no filter.
YYYY-MM-DD. Omit with endDate set for All Time (from the first answer, no previous-period comparison).
YYYY-MM-DD
Days back from today on the team's calendar, converted to startDate/endDate. Ignored when startDate or endDate is set. Defaults to 30.
x >= 1'branded', 'unbranded', or 'all'.
'tracked', 'untracked', or empty for both.
Comma-separated prompt intents, or empty for all.
Include previous-period comparison values alongside each data point (roughly doubles the time-series payload). Defaults to false.
Was this page helpful?

