Keyword position history
curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/keyword-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/keyword-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/keyword-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/keyword-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/keyword-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/keyword-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/keyword-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": [
{
"date": "<string>",
"position": 123,
"clicks": 123,
"impressions": 123,
"source": "internal"
}
],
"source": "internal"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}Rank Tracking
Keyword History
View the position history for a specific tracked keyword over time.
GET
/
v3
/
rank-tracking
/
keyword-history
Keyword position history
curl --request GET \
--url https://api.snowseo.com/v3/rank-tracking/keyword-history \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.snowseo.com/v3/rank-tracking/keyword-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/keyword-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/keyword-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/keyword-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/keyword-history")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/rank-tracking/keyword-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": [
{
"date": "<string>",
"position": 123,
"clicks": 123,
"impressions": 123,
"source": "internal"
}
],
"source": "internal"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}{
"success": true,
"error": "<string>",
"code": "<string>",
"message": "<string>",
"reference": "<string>"
}See how a keyword’s search position has changed over time. Useful for tracking the impact of SEO changes or content updates. The
keyword query parameter is required (400 without it), and the default window is 90 days (see Date Windows).
Key fields
| Field | What It Tells You |
|---|---|
items | Array of daily data points, oldest first. Each is { date, position, clicks, impressions, source } |
source | Where the data is from - gsc (Google Search Console) or internal (SnowSEO’s own tracking). Repeated on each item |
Position data comes from Google Search Console when it is connected and returns rows for the window. When Search Console is not connected, or returns no rows, SnowSEO falls back to its own internal tracking; those points have 0 clicks and 0 impressions.
The internal fallback only matches a tracked keyword whose country equals the
country parameter, or one with no country when country is omitted. If there is no such keyword, items is empty.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Query Parameters
Team ID
Keyword to get history for
Start date (YYYY-MM-DD on the team's calendar). days is ignored when a date is sent. History is capped at 365 days: with endDate alone, the 365 days up to endDate 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 90.
Required range:
x >= 1Country filter
Was this page helpful?

