Tracked keywords with SERP result history
curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/keywords/serp-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/keywords/serp-history"
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/keywords/serp-history', 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/keywords/serp-history",
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/keywords/serp-history"
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/keywords/serp-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/keywords/serp-history")
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{
"items": [
{
"id": "<string>",
"keywordId": "<string>",
"keyword": "<string>",
"countryId": "<string>",
"languageId": "<string>",
"locationCriteriaId": 123,
"locationCanonicalName": "<string>",
"position": 123,
"active": true,
"status": "completed",
"refreshedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"isTracked": true,
"trackingId": "<string>",
"monthlyVolume": 123,
"difficulty": "<string>",
"competitionScore": 123,
"cpc": 123,
"intent": "<string>",
"positionHistory": [
{
"date": "<string>",
"position": 123
}
],
"positionTrend": "improved",
"nextRunAt": "<string>",
"serpFeatures": {},
"resultHistory": [
{}
]
}
],
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Rank Tracking
Tracked Keywords SERP History
Tracked keywords with position history and the stored search results for each check date.
GET
/
v3
/
rank-tracking
/
keywords
/
serp-history
Tracked keywords with SERP result history
curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/keywords/serp-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/keywords/serp-history"
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/keywords/serp-history', 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/keywords/serp-history",
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/keywords/serp-history"
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/keywords/serp-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/keywords/serp-history")
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{
"items": [
{
"id": "<string>",
"keywordId": "<string>",
"keyword": "<string>",
"countryId": "<string>",
"languageId": "<string>",
"locationCriteriaId": 123,
"locationCanonicalName": "<string>",
"position": 123,
"active": true,
"status": "completed",
"refreshedAt": "<string>",
"createdAt": "<string>",
"updatedAt": "<string>",
"isTracked": true,
"trackingId": "<string>",
"monthlyVolume": 123,
"difficulty": "<string>",
"competitionScore": 123,
"cpc": 123,
"intent": "<string>",
"positionHistory": [
{
"date": "<string>",
"position": 123
}
],
"positionTrend": "improved",
"nextRunAt": "<string>",
"serpFeatures": {},
"resultHistory": [
{}
]
}
],
"page": 123,
"pageSize": 123,
"total": 123,
"totalPages": 123
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Everything in Tracked Keywords Summary, plus
resultHistory on each keyword: the search results stored at each check, one entry per check date with the ranked URLs in order.
This is the largest keyword payload. It returns 25 keywords per page unless pageSize is set (all returns every keyword); use page to move through them and search to match text anywhere in the keyword.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Query Parameters
Team ID
When true, also returns soft-untracked (active=false) keywords so the UI can offer re-tracking. Defaults to false (active only).
Case-insensitive text to match anywhere in the keyword.
1-based page. Default 1.
Rows per page (max 1000), or 'all'. Every response reports total and totalPages.
Was this page helpful?

