curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/top-keywords \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/top-keywords"
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/rank-tracking/top-keywords', 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/rank-tracking/top-keywords",
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/rank-tracking/top-keywords"
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/rank-tracking/top-keywords")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/top-keywords")
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,
"items": [
{
"keyword": "<string>",
"clicks": 123,
"impressions": 123,
"ctr": 123,
"position": 123,
"isStarred": true,
"languageId": "<string>",
"clicksChange": 123,
"impressionsChange": 123,
"ctrChange": 123,
"positionChange": 123,
"pages": 123,
"rankedPages": [
{
"page": "<string>",
"clicks": 123,
"impressions": 123,
"ctr": 123,
"position": 123,
"clicksChange": 123,
"impressionsChange": 123,
"ctrChange": 123,
"positionChange": 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>"
}Top Keywords
See your best-performing keywords from Search Console and tracking.
curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/top-keywords \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/top-keywords"
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/rank-tracking/top-keywords', 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/rank-tracking/top-keywords",
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/rank-tracking/top-keywords"
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/rank-tracking/top-keywords")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/top-keywords")
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,
"items": [
{
"keyword": "<string>",
"clicks": 123,
"impressions": 123,
"ctr": 123,
"position": 123,
"isStarred": true,
"languageId": "<string>",
"clicksChange": 123,
"impressionsChange": 123,
"ctrChange": 123,
"positionChange": 123,
"pages": 123,
"rankedPages": [
{
"page": "<string>",
"clicks": 123,
"impressions": 123,
"ctr": 123,
"position": 123,
"clicksChange": 123,
"impressionsChange": 123,
"ctrChange": 123,
"positionChange": 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>"
}scope controls the source:
all(default): Search Console queries in Search Console order, with tracked keywords appended. Rows are not re-sorted by position.ranked: Search Console queries only. Returns404when Search Console is not connected.tracked: tracked keywords only.
clicks, impressions, and ctr are null for tracked-only rows, which have no Search Console data.
search matches the keyword across every keyword, not only the top 50, and returns the matches paginated (page, pageSize, total, totalPages).Authorizations
Your SnowSEO API key (sk_...).
Query Parameters
x >= 1Case-insensitive text matched against the keyword. Applied before paging, so total counts the matches.
kw, pos, imp, clicks, pages, posDelta asc, desc rising, falling, new, lost Team ID
Start date (YYYY-MM-DD on the team's calendar). days is ignored when a date is sent; ranges over 365 days are clamped. Omit with endDate set for All Time: tracked data starts at the first stored reading, Search Console at its oldest kept day (about 16 months), and no period comparison or change values are returned.
End date (YYYY-MM-DD on the team's calendar). days is ignored when a date is sent.
Days back from today on the team's calendar, converted to startDate/endDate. Ignored when startDate or endDate is set. Defaults to 30.
x >= 1Device filter
Search type filter
Country filter
Keyword universe: all (GSC + tracked merged), ranked (GSC only), tracked (tracked only). Defaults to all.
all, ranked, tracked Max results
Rows to return, or all.
Include period-over-period comparison
Embed each keyword's ranking page URLs (two extra Search Console queries plus every stored SERP page). Defaults to true; pass false when only the keyword rows are rendered.
Was this page helpful?

