curl --request POST \
--url https://api.example.com/v1/keywords/{id}/report \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contentId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"title": "<string>"
}
'import requests
url = "https://api.example.com/v1/keywords/{id}/report"
payload = {
"contentId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"title": "<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({
contentId: '<string>',
html: '<string>',
metaDescription: '<string>',
title: '<string>'
})
};
fetch('https://api.example.com/v1/keywords/{id}/report', 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.example.com/v1/keywords/{id}/report",
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([
'contentId' => '<string>',
'html' => '<string>',
'metaDescription' => '<string>',
'title' => '<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.example.com/v1/keywords/{id}/report"
payload := strings.NewReader("{\n \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<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.example.com/v1/keywords/{id}/report")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/keywords/{id}/report")
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 \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"googleAiOverview": {
"brands": [
{
"category": "<string>",
"count": 123,
"name": "<string>"
}
],
"preview": "<string>",
"recommendations": {
"geoTopicsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
}
},
"score": 123,
"sources": [
{
"category": "<string>",
"domain": "<string>",
"organicPosition": 123,
"position": 123,
"title": "<string>",
"type": "<string>",
"url": "<string>"
}
]
},
"googleSearch": {
"competitors": [
{
"isFeaturedSnippet": true,
"position": 123,
"title": "<string>",
"url": "<string>",
"wordsCount": 123
}
],
"recommendations": {
"articleWordsCount": {
"score": 123,
"data": {},
"items": [
{}
]
},
"focusKeywordInTitle": {
"score": 123,
"data": {},
"items": [
{}
]
},
"incomingLinks": {
"score": 123,
"data": {},
"items": [
{}
]
},
"outgoingLinks": {
"score": 123,
"data": {},
"items": [
{}
]
},
"questionsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
},
"searchIntentsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
},
"topicsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
}
},
"score": 123
}
}Generate keyword analysis report
Returns an analysis report for the keyword, scoring the provided content against each surface. The report contains the data computed by the keyword analysis — an overall score, typed recommendations (each with its own sub-score and supporting data), and surface-specific context: SERP competitors for Google Search (googleSearch); cited sources, mentioned brands, and the markdown preview of the AI response for Google AI Overview (googleAiOverview). Provide either contentId (by reference) or title + html (by value), not both.
curl --request POST \
--url https://api.example.com/v1/keywords/{id}/report \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"contentId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"title": "<string>"
}
'import requests
url = "https://api.example.com/v1/keywords/{id}/report"
payload = {
"contentId": "<string>",
"html": "<string>",
"metaDescription": "<string>",
"title": "<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({
contentId: '<string>',
html: '<string>',
metaDescription: '<string>',
title: '<string>'
})
};
fetch('https://api.example.com/v1/keywords/{id}/report', 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.example.com/v1/keywords/{id}/report",
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([
'contentId' => '<string>',
'html' => '<string>',
'metaDescription' => '<string>',
'title' => '<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.example.com/v1/keywords/{id}/report"
payload := strings.NewReader("{\n \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<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.example.com/v1/keywords/{id}/report")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/keywords/{id}/report")
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 \"contentId\": \"<string>\",\n \"html\": \"<string>\",\n \"metaDescription\": \"<string>\",\n \"title\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"googleAiOverview": {
"brands": [
{
"category": "<string>",
"count": 123,
"name": "<string>"
}
],
"preview": "<string>",
"recommendations": {
"geoTopicsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
}
},
"score": 123,
"sources": [
{
"category": "<string>",
"domain": "<string>",
"organicPosition": 123,
"position": 123,
"title": "<string>",
"type": "<string>",
"url": "<string>"
}
]
},
"googleSearch": {
"competitors": [
{
"isFeaturedSnippet": true,
"position": 123,
"title": "<string>",
"url": "<string>",
"wordsCount": 123
}
],
"recommendations": {
"articleWordsCount": {
"score": 123,
"data": {},
"items": [
{}
]
},
"focusKeywordInTitle": {
"score": 123,
"data": {},
"items": [
{}
]
},
"incomingLinks": {
"score": 123,
"data": {},
"items": [
{}
]
},
"outgoingLinks": {
"score": 123,
"data": {},
"items": [
{}
]
},
"questionsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
},
"searchIntentsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
},
"topicsSuggestion": {
"score": 123,
"data": {},
"items": [
{}
]
}
},
"score": 123
}
}Authorizations
API key starting with sk_. Generate one in Settings > API Keys.
Path Parameters
Keyword ID.
Body
Content ID to score (fetches HTML automatically).
HTML content to score.
Meta description (optional). Accepted for forward compatibility but currently NOT factored into recommendations — the score is computed from title and html only.
Title of the content to score.
Response
Default Response
Was this page helpful?