List topic clusters
curl --request GET \
--url https://api.snowseo.com/v3/topic-clusters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/topic-clusters"
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/topic-clusters', 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/topic-clusters",
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/topic-clusters"
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/topic-clusters")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/topic-clusters")
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{
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123,
"summary": {
"clusterCount": 123,
"totalKeywords": 123,
"trackedPrompts": 123,
"avgSearchVisibility": 123,
"avgAiVisibility": 123,
"avgTopicalAuthority": 123,
"topicalAuthorityChangePct": 123,
"coveredCount": 123,
"coverageTotal": 123,
"avgTrackedSearchVisibility": 123,
"avgTrackedAiVisibility": 123
},
"items": [
{
"id": "<string>",
"name": "<string>",
"createdAt": "<string>",
"keywordCount": 123,
"promptCount": 123,
"trackedPromptCount": 123,
"trackedKeywordCount": 123,
"aiVisibility": 123,
"searchVisibility": 123,
"topicalAuthorityScore": 123,
"coveragePct": 123,
"coverage": {
"total": 123,
"published": 123,
"generated": 123,
"planned": 123,
"uncovered": 123
},
"changePct": 123,
"trend": "rising",
"leaders": [
{
"name": "<string>",
"domain": "<string>"
}
]
}
]
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Topic Clusters
Topics
List all your topic clusters.
GET
/
v3
/
topic-clusters
List topic clusters
curl --request GET \
--url https://api.snowseo.com/v3/topic-clusters \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/topic-clusters"
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/topic-clusters', 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/topic-clusters",
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/topic-clusters"
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/topic-clusters")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/topic-clusters")
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{
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123,
"summary": {
"clusterCount": 123,
"totalKeywords": 123,
"trackedPrompts": 123,
"avgSearchVisibility": 123,
"avgAiVisibility": 123,
"avgTopicalAuthority": 123,
"topicalAuthorityChangePct": 123,
"coveredCount": 123,
"coverageTotal": 123,
"avgTrackedSearchVisibility": 123,
"avgTrackedAiVisibility": 123
},
"items": [
{
"id": "<string>",
"name": "<string>",
"createdAt": "<string>",
"keywordCount": 123,
"promptCount": 123,
"trackedPromptCount": 123,
"trackedKeywordCount": 123,
"aiVisibility": 123,
"searchVisibility": 123,
"topicalAuthorityScore": 123,
"coveragePct": 123,
"coverage": {
"total": 123,
"published": 123,
"generated": 123,
"planned": 123,
"uncovered": 123
},
"changePct": 123,
"trend": "rising",
"leaders": [
{
"name": "<string>",
"domain": "<string>"
}
]
}
]
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Topic clusters group related keywords and AI prompts together, letting you track your authority and visibility for each topic area.
Query parameters:
teamId, search (name contains), sortBy (name, contentCount, keywordCount, promptCount, topicalAuthorityScore, coveragePct, changePct), sortDir (asc or desc), page (1-based), and pageSize (a number or all; 25 when omitted). The response has page, pageSize, total, totalPages, a team-wide summary, and items. Each item has id, name, keyword and prompt counts, aiVisibility, searchVisibility, topicalAuthorityScore, coveragePct, coverage, changePct, trend, and leaders. Use an item’s id as the topicId when creating articles.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Query Parameters
Team ID
Narrows the list to clusters whose name contains this.
Column to order by. Omit for alphabetical.
Available options:
name, contentCount, keywordCount, promptCount, topicalAuthorityScore, coveragePct, changePct Available options:
asc, desc 1-based page. Default 1.
Rows per page (max 1000), or 'all'. Every response reports total and totalPages.
Was this page helpful?

