Keyword Search Volume API
curl --request POST \
--url https://api.socq.ai/v1/seo/keyword-search-volume \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"keyword research"
],
"location_code": 2840,
"language_code": "en"
}
'import requests
url = "https://api.socq.ai/v1/seo/keyword-search-volume"
payload = {
"keywords": ["keyword research"],
"location_code": 2840,
"language_code": "en"
}
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({keywords: ['keyword research'], location_code: 2840, language_code: 'en'})
};
fetch('https://api.socq.ai/v1/seo/keyword-search-volume', 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.socq.ai/v1/seo/keyword-search-volume",
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' => [
'keyword research'
],
'location_code' => 2840,
'language_code' => 'en'
]),
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.socq.ai/v1/seo/keyword-search-volume"
payload := strings.NewReader("{\n \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\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.socq.ai/v1/seo/keyword-search-volume")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.socq.ai/v1/seo/keyword-search-volume")
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 \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"data": {
"task_id": "<string>",
"status": "<string>",
"created_time": "<string>"
}
}{
"code": 422,
"error": {
"message": "<string>",
"type": "<string>",
"details": {}
}
}Keyword Search Volume
Batch search volume, CPC, competition, and monthly trends.
POST
/
v1
/
seo
/
keyword-search-volume
Keyword Search Volume API
curl --request POST \
--url https://api.socq.ai/v1/seo/keyword-search-volume \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"keywords": [
"keyword research"
],
"location_code": 2840,
"language_code": "en"
}
'import requests
url = "https://api.socq.ai/v1/seo/keyword-search-volume"
payload = {
"keywords": ["keyword research"],
"location_code": 2840,
"language_code": "en"
}
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({keywords: ['keyword research'], location_code: 2840, language_code: 'en'})
};
fetch('https://api.socq.ai/v1/seo/keyword-search-volume', 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.socq.ai/v1/seo/keyword-search-volume",
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' => [
'keyword research'
],
'location_code' => 2840,
'language_code' => 'en'
]),
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.socq.ai/v1/seo/keyword-search-volume"
payload := strings.NewReader("{\n \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\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.socq.ai/v1/seo/keyword-search-volume")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.socq.ai/v1/seo/keyword-search-volume")
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 \"keywords\": [\n \"keyword research\"\n ],\n \"location_code\": 2840,\n \"language_code\": \"en\"\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"data": {
"task_id": "<string>",
"status": "<string>",
"created_time": "<string>"
}
}{
"code": 422,
"error": {
"message": "<string>",
"type": "<string>",
"details": {}
}
}Keyword Search Volume
{"keywords":["keyword research","seo tools"],"location_code":2840,"language_code":"en"}
Result Fields
Task results use the stable SocQ fields below. Source-specific field names and formats are normalized without inferring or enriching values that the source did not provide. To request a smaller field set, usefields for MCP queries, _result_fields for typed tools, or --result-fields in the CLI. Declared fields remain present when their value is null.
| Field | Type | Nullable | Description |
|---|---|---|---|
id | string | Yes | Unique identifier for this result item. |
platform | string | No | Platform the result belongs to, such as instagram or linkedin. |
resource | string | No | SocQ resource represented by the result, such as videos or comments. |
type | string | No | Category of the result item, such as video, post, or comment. |
url | string | Yes | Public URL of the result item when available. |
published_at | string | Yes | Time the source item was published, in ISO 8601 format when available. |
collected_at | string | No | Time SocQ collected or processed this result, in ISO 8601 format. |
keyword | string | Yes | Keyword represented by the result. |
search_volume | integer | Yes | Estimated number of searches for the keyword in the configured period and market. |
difficulty | number | Yes | Estimated ranking difficulty score for the keyword. |
intent | string | Yes | Detected primary search intent for the keyword. |
cpc | number | Yes | Estimated cost per click for the keyword. |
competition | number | Yes | Advertiser competition level for the keyword. |
rank | integer | Yes | Ranking position of the target page for the keyword. |
target_url | string | Yes | Page URL associated with the keyword ranking. |
Completed Task Response
{
"code": 200,
"data": {
"task_id": "C7P8NOJPFV7838GU",
"status": "succeeded",
"public_id": "seo/keyword-search-volume",
"result_count": 1,
"credits_amount": 24,
"results": {
"limit": 1,
"next_cursor": null,
"has_more": false,
"schema_id": "seo-keyword",
"schema_version": "1.0",
"items": [
{
"id": "keyword research",
"platform": "seo",
"resource": "keyword-search-volume",
"type": "keyword-search-volume",
"url": null,
"published_at": null,
"collected_at": "2026-07-31T02:25:10.519540Z",
"keyword": "keyword research",
"search_volume": null,
"difficulty": null,
"intent": null,
"cpc": null,
"competition": null,
"rank": null,
"target_url": null
}
]
}
}
}
Authorizations
bearerAuthapiKeyAuth
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json
Use language values supported by Keyword Search Volume: Chinese uses zh_CN or zh_TW, not zh. Locale support differs between SEO endpoints.
Keywords to analyze in one batch.
Required array length:
1 - 1000 elementsRequired string length:
1 - 80Supported language name; use either language or language_code.
Available options:
Arabic, Bengali, Bulgarian, Catalan, Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Danish, Dutch, English, Estonian, Farsi, Finnish, French, German, Greek, Hebrew (old), Hindi, Hungarian, Icelandic, Indonesian, Italian, Japanese, Korean, Latvian, Lithuanian, Malay, Norwegian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swedish, Tagalog, Tamil, Telugu, Thai, Turkish, Ukrainian, Urdu, Vietnamese Minimum string length:
1Language code supported by Keyword Search Volume. Chinese uses zh_CN or zh_TW; zh is not supported. Language sets differ between SEO endpoints.
Available options:
ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, hi, hr, hu, id, is, it, iw, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sr, sv, ta, te, th, tl, tr, uk, ur, vi, zh_CN, zh_TW Required string length:
2 - 10Search market location code.
Required range:
x >= 1Search market location name.
Minimum string length:
1Required range:
1 <= x <= 2000
