Generate target keywords for an article
curl --request POST \
--url https://api.snowseo.com/v3/generate-article/generate-keywords \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"user_keywords": "<string>",
"competitor_links": "<string>",
"keyword_count": "<string>",
"topicId": "<string>",
"country": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.snowseo.com/v3/generate-article/generate-keywords"
payload = {
"title": "<string>",
"user_keywords": "<string>",
"competitor_links": "<string>",
"keyword_count": "<string>",
"topicId": "<string>",
"country": "<string>",
"language": "<string>"
}
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({
title: '<string>',
user_keywords: '<string>',
competitor_links: '<string>',
keyword_count: '<string>',
topicId: '<string>',
country: '<string>',
language: '<string>'
})
};
fetch('https://api.snowseo.com/v3/generate-article/generate-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/generate-article/generate-keywords",
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([
'title' => '<string>',
'user_keywords' => '<string>',
'competitor_links' => '<string>',
'keyword_count' => '<string>',
'topicId' => '<string>',
'country' => '<string>',
'language' => '<string>'
]),
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/generate-article/generate-keywords"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\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/generate-article/generate-keywords")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/generate-article/generate-keywords")
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 \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body"<string>"Article Generation
Generate Keywords
Generate ranked target keywords for an article.
POST
/
v3
/
generate-article
/
generate-keywords
Generate target keywords for an article
curl --request POST \
--url https://api.snowseo.com/v3/generate-article/generate-keywords \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"title": "<string>",
"user_keywords": "<string>",
"competitor_links": "<string>",
"keyword_count": "<string>",
"topicId": "<string>",
"country": "<string>",
"language": "<string>"
}
'import requests
url = "https://api.snowseo.com/v3/generate-article/generate-keywords"
payload = {
"title": "<string>",
"user_keywords": "<string>",
"competitor_links": "<string>",
"keyword_count": "<string>",
"topicId": "<string>",
"country": "<string>",
"language": "<string>"
}
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({
title: '<string>',
user_keywords: '<string>',
competitor_links: '<string>',
keyword_count: '<string>',
topicId: '<string>',
country: '<string>',
language: '<string>'
})
};
fetch('https://api.snowseo.com/v3/generate-article/generate-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/generate-article/generate-keywords",
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([
'title' => '<string>',
'user_keywords' => '<string>',
'competitor_links' => '<string>',
'keyword_count' => '<string>',
'topicId' => '<string>',
'country' => '<string>',
'language' => '<string>'
]),
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/generate-article/generate-keywords"
payload := strings.NewReader("{\n \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\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/generate-article/generate-keywords")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.snowseo.com/v3/generate-article/generate-keywords")
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 \"title\": \"<string>\",\n \"user_keywords\": \"<string>\",\n \"competitor_links\": \"<string>\",\n \"keyword_count\": \"<string>\",\n \"topicId\": \"<string>\",\n \"country\": \"<string>\",\n \"language\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body"<string>"Generate target keywords (with search volume and relevance) for an article title. Optionally pass competitor URLs - from Find Competitor Sources - to mine keywords from their pages.
JSON body fields:
title (required), user_keywords, competitor_links, keyword_count (1-40, default 10), topicId (offers the cluster’s keywords no article covers yet), country, and language. The response streams newline-delimited JSON (application/x-ndjson): progress lines contain status, and the final line is { keywords, cannibalization }. An error after streaming starts arrives as an error line with HTTP 200. Limited to 20 requests per day.
Use the chosen keywords when calling Generate Outline or Generate Article.Authorizations
bearerAuthapiKey
Your SnowSEO API key (sk_...).
Body
application/json
Article title to generate keywords for.
Existing keywords to prioritize and expand.
Competitor article URLs to crawl for keyword mining.
How many keywords to return (1–40, default 10).
Topic cluster id. Its keywords that no article covers yet are offered to the model.
Response
200 - application/x-ndjson
A newline-delimited stream. Whitespace keeps the connection alive; status and final result are JSON lines. An error after streaming starts is returned as a JSON error line with HTTP 200.
Newline-delimited JSON events
Was this page helpful?

