Generate keyword ideas
curl --request POST \
--url https://api.snowseo.com/v3/keyword-research \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"teamId": "<string>",
"keyword": "<string>",
"page_url": "<string>",
"location_ids": "<string>",
"language_id": "1000"
}
'import requests
url = "https://api.snowseo.com/v3/keyword-research"
payload = {
"teamId": "<string>",
"keyword": "<string>",
"page_url": "<string>",
"location_ids": "<string>",
"language_id": "1000"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
teamId: '<string>',
keyword: '<string>',
page_url: '<string>',
location_ids: '<string>',
language_id: '1000'
})
};
fetch('https://api.snowseo.com/v3/keyword-research', 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/keyword-research",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'teamId' => '<string>',
'keyword' => '<string>',
'page_url' => '<string>',
'location_ids' => '<string>',
'language_id' => '1000'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/keyword-research"
payload := strings.NewReader("{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.snowseo.com/v3/keyword-research")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/keyword-research")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}"
response = http.request(request)
puts response.read_body{
"perCountry": [
{
"countryId": "<string>",
"count": 123,
"exact_keyword": [
{
"keyword": "<string>",
"monthlysearch": 123,
"difficulty": "<string>",
"competition_score": 123,
"annotation": "<string>",
"cpc": 123,
"historic_data": [
{
"year": 123,
"month": 123,
"search_volume": 123
}
]
}
],
"related_keywords": [
{
"keyword": "<string>",
"monthlysearch": 123,
"difficulty": "<string>",
"competition_score": 123,
"annotation": "<string>",
"cpc": 123,
"historic_data": [
{
"year": 123,
"month": 123,
"search_volume": 123
}
]
}
]
}
],
"defaultCountryId": "<string>"
}{
"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>"
}Keywords & Research
Keyword Research
Find keyword ideas with search volume, competition, and cost-per-click data.
POST
/
v3
/
keyword-research
Generate keyword ideas
curl --request POST \
--url https://api.snowseo.com/v3/keyword-research \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"teamId": "<string>",
"keyword": "<string>",
"page_url": "<string>",
"location_ids": "<string>",
"language_id": "1000"
}
'import requests
url = "https://api.snowseo.com/v3/keyword-research"
payload = {
"teamId": "<string>",
"keyword": "<string>",
"page_url": "<string>",
"location_ids": "<string>",
"language_id": "1000"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
teamId: '<string>',
keyword: '<string>',
page_url: '<string>',
location_ids: '<string>',
language_id: '1000'
})
};
fetch('https://api.snowseo.com/v3/keyword-research', 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/keyword-research",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'teamId' => '<string>',
'keyword' => '<string>',
'page_url' => '<string>',
'location_ids' => '<string>',
'language_id' => '1000'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.snowseo.com/v3/keyword-research"
payload := strings.NewReader("{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.snowseo.com/v3/keyword-research")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/keyword-research")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"teamId\": \"<string>\",\n \"keyword\": \"<string>\",\n \"page_url\": \"<string>\",\n \"location_ids\": \"<string>\",\n \"language_id\": \"1000\"\n}"
response = http.request(request)
puts response.read_body{
"perCountry": [
{
"countryId": "<string>",
"count": 123,
"exact_keyword": [
{
"keyword": "<string>",
"monthlysearch": 123,
"difficulty": "<string>",
"competition_score": 123,
"annotation": "<string>",
"cpc": 123,
"historic_data": [
{
"year": 123,
"month": 123,
"search_volume": 123
}
]
}
],
"related_keywords": [
{
"keyword": "<string>",
"monthlysearch": 123,
"difficulty": "<string>",
"competition_score": 123,
"annotation": "<string>",
"cpc": 123,
"historic_data": [
{
"year": 123,
"month": 123,
"search_volume": 123
}
]
}
]
}
],
"defaultCountryId": "<string>"
}{
"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>"
}Enter a seed keyword or a page URL and get back a list of related keyword ideas complete with monthly search volume, competition level, and CPC estimates. Powered by Google Ads Keyword Planner data (with DataForSEO as an alternative provider).
Send a JSON body with:
teamId, keyword (one or more comma-separated seeds) or page_url (at least one is required, otherwise 400), location_ids (comma-separated location IDs; all means worldwide and can be mixed with IDs, e.g. all,2380; omitted means worldwide), and language_id (defaults to 1000, English).
The response has a perCountry array with one entry per requested location (a single worldwide entry when location_ids is omitted) and defaultCountryId, the location with the most results (the first requested on a tie). Each entry has countryId (null for worldwide), count, and exact_keyword and related_keywords arrays. Each keyword item has keyword, monthlysearch, difficulty, competition_score, annotation, cpc, and historic_data (monthly volumes).
Each researched location uses 1 keyword research credit from your plan’s allowance on every call, including repeats of the same search. That’s why this is a
POST: a GET could be repeated by caches or retries and charged again. Researching your own website’s URL is free. Returns 402 when the allowance is too low and 503 if no keyword data provider is configured. Limited to 250 requests per day.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Body
application/json
Team ID
Seed keyword; split on commas into several seeds. Required if page_url is omitted.
Seed URL. Required if keyword is omitted. Empty string allowed when using keyword.
Comma-separated location IDs (e.g. "2840,2826"). Use "all" for worldwide; it can be combined with specific IDs (e.g. "all,2380"). Omitted = worldwide.
Google Ads language resource ID (default: "1000" = English).
Was this page helpful?

