Get Google keyword metrics
curl --request POST \
--url http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics \
--header 'API-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"protein powder"
],
"countryCode": "US",
"languageCode": "en"
}
'import requests
url = "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics"
payload = {
"keywords": ["protein powder"],
"countryCode": "US",
"languageCode": "en"
}
headers = {
"API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({keywords: ['protein powder'], countryCode: 'US', languageCode: 'en'})
};
fetch('http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics', 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 => "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics",
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([
'keywords' => [
'protein powder'
],
'countryCode' => 'US',
'languageCode' => 'en'
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"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 := "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics"
payload := strings.NewReader("{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("API-Key", "<api-key>")
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("http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics")
.header("API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"countryCode": "US",
"items": [
{
"keyword": "protein powder",
"metrics": {
"cpc": 1.66,
"keywordDifficulty": 32,
"monthlySearches": [
{
"month": 6,
"year": 2026,
"searchVolume": 450000
}
],
"searchIntent": "transactional",
"searchVolume": 301000,
"searchVolumeTrend": {
"monthly": -33,
"quarterly": 50,
"yearly": 50
}
}
}
],
"languageCode": "en"
}{
"code": "COMMON_VALIDATION",
"details": [
"limit: must be 100 or less"
],
"message": "Data validation failed"
}{
"code": "COMMON_UNAUTHORIZED",
"message": "Unauthenticated user"
}{
"code": "INSUFFICIENT_CREDITS",
"message": "Insufficient credits."
}{
"code": "PLATFORM_RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}{
"message": "Internal Server Error",
"requestID": "bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk"
}{
"code": "KEYWORD_METRICS_PROVIDER_UNAVAILABLE",
"message": "Failed to retrieve keyword metrics. Try again shortly"
}{
"code": "KEYWORD_METRICS_NOT_CONFIGURED",
"message": "Keyword metrics feature is not enabled yet"
}Keywords (Beta)
Google keyword metrics
[BETA] This is a beta API. The response spec may change without notice.
Retrieves Google search metrics (average monthly search volume, SEO difficulty, CPC, search intent, search volume trend) for a list of keywords (up to 100). Keywords with no data have metrics set to null. If metrics is present but searchVolume is null, the keyword’s search volume is not disclosed.
Errors
| HTTP | Code | Description |
|---|---|---|
| 400 | COMMON_BINDING | Failed to parse request body JSON |
| 400 | COMMON_VALIDATION | Keyword constraints violated: 1 to 100 keywords, no duplicates, each 80 characters or less |
| 400 | KEYWORD_COUNTRY_NOT_SUPPORTED | Unsupported country code |
| 400 | KEYWORD_METRICS_PROVIDER_REJECTED | The provider rejected the request (language and country combination, keyword format) |
| 401 | COMMON_UNAUTHORIZED | API key or access token is missing or invalid |
| 402 | INSUFFICIENT_CREDITS | The organization’s credit balance is lower than the unit price of this request |
| 429 | PLATFORM_RATE_LIMIT_EXCEEDED | Rate limit exceeded. Wait the number of seconds in the Retry-After header, then retry |
| 500 | — | Internal server error. Returns message and requestID without code |
| 502 | KEYWORD_METRICS_PROVIDER_UNAVAILABLE | Failed to call the metrics provider. Retry shortly |
| 503 | KEYWORD_METRICS_NOT_CONFIGURED | The keyword metrics feature is not enabled |
POST
/
v1beta
/
platform
/
keywords
/
google
/
metrics
Get Google keyword metrics
curl --request POST \
--url http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics \
--header 'API-Key: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"protein powder"
],
"countryCode": "US",
"languageCode": "en"
}
'import requests
url = "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics"
payload = {
"keywords": ["protein powder"],
"countryCode": "US",
"languageCode": "en"
}
headers = {
"API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({keywords: ['protein powder'], countryCode: 'US', languageCode: 'en'})
};
fetch('http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics', 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 => "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics",
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([
'keywords' => [
'protein powder'
],
'countryCode' => 'US',
'languageCode' => 'en'
]),
CURLOPT_HTTPHEADER => [
"API-Key: <api-key>",
"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 := "http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics"
payload := strings.NewReader("{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("API-Key", "<api-key>")
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("http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics")
.header("API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://dev-platform-api.trychainshift.ai/api/v1beta/platform/keywords/google/metrics")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Post.new(url)
request["API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"keywords\": [\n \"protein powder\"\n ],\n \"countryCode\": \"US\",\n \"languageCode\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"countryCode": "US",
"items": [
{
"keyword": "protein powder",
"metrics": {
"cpc": 1.66,
"keywordDifficulty": 32,
"monthlySearches": [
{
"month": 6,
"year": 2026,
"searchVolume": 450000
}
],
"searchIntent": "transactional",
"searchVolume": 301000,
"searchVolumeTrend": {
"monthly": -33,
"quarterly": 50,
"yearly": 50
}
}
}
],
"languageCode": "en"
}{
"code": "COMMON_VALIDATION",
"details": [
"limit: must be 100 or less"
],
"message": "Data validation failed"
}{
"code": "COMMON_UNAUTHORIZED",
"message": "Unauthenticated user"
}{
"code": "INSUFFICIENT_CREDITS",
"message": "Insufficient credits."
}{
"code": "PLATFORM_RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}{
"message": "Internal Server Error",
"requestID": "bkZqnHQepkgTOocTvyHWSlHcGzRqQbZk"
}{
"code": "KEYWORD_METRICS_PROVIDER_UNAVAILABLE",
"message": "Failed to retrieve keyword metrics. Try again shortly"
}{
"code": "KEYWORD_METRICS_NOT_CONFIGURED",
"message": "Keyword metrics feature is not enabled yet"
}Body
application/json
Keyword metrics request