curl --request GET \
--url https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId} \
--header 'x-project-id: <x-project-id>'import requests
url = "https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}"
headers = {"x-project-id": "<x-project-id>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-project-id': '<x-project-id>'}};
fetch('https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}', 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.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-project-id: <x-project-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-project-id", "<x-project-id>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}")
.header("x-project-id", "<x-project-id>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-project-id"] = '<x-project-id>'
response = http.request(request)
puts response.read_body{
"id": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"label": "Electric vehicle charging",
"keywords": [
"ev charging",
"charging network"
],
"size": 14,
"ownedPresent": false,
"competitorPresent": true,
"isContentGap": true,
"citationCount": 128,
"sources": [
{
"url": "https://example.com/ev/charging-guide",
"domain": "example.com",
"sourceDomainId": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"month": "2026-06",
"relationship": "independent",
"ownedPresent": false,
"controllability": "earnable",
"categorySlug": "news_media",
"categoryLabel": "News & Press",
"citationCount": 23,
"queries": [
{
"queryId": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"query": "best ev charging networks 2026"
}
]
}
]
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}Content-gap detail for one topic (its sources)
Lists every source (cited page snapshot) grouped in the topic, each with whether it’s the project’s own content (“is my brand present”), its relationship + controllability + source-type category, the queries it was cited from, and its citation count — sorted most-cited first.
curl --request GET \
--url https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId} \
--header 'x-project-id: <x-project-id>'import requests
url = "https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}"
headers = {"x-project-id": "<x-project-id>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-project-id': '<x-project-id>'}};
fetch('https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}', 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.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-project-id: <x-project-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-project-id", "<x-project-id>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}")
.header("x-project-id", "<x-project-id>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mentionlab.io/api/v1/source-topics/runs/{runId}/content-gap/topics/{topicId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-project-id"] = '<x-project-id>'
response = http.request(request)
puts response.read_body{
"id": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"label": "Electric vehicle charging",
"keywords": [
"ev charging",
"charging network"
],
"size": 14,
"ownedPresent": false,
"competitorPresent": true,
"isContentGap": true,
"citationCount": 128,
"sources": [
{
"url": "https://example.com/ev/charging-guide",
"domain": "example.com",
"sourceDomainId": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"month": "2026-06",
"relationship": "independent",
"ownedPresent": false,
"controllability": "earnable",
"categorySlug": "news_media",
"categoryLabel": "News & Press",
"citationCount": 23,
"queries": [
{
"queryId": "019dd32e-b19e-7956-88f6-4b9a877f3697",
"query": "best ev charging networks 2026"
}
]
}
]
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}{
"statusCode": 400,
"message": "Validation failed",
"error": "Bad Request"
}Headers
Project ID to specify the project context
Path Parameters
UUID of the run the topic belongs to.
UUID of the topic (cluster) to detail.
Response
Topic (cluster) UUID.
"019dd32e-b19e-7956-88f6-4b9a877f3697"
LLM-assigned topic label.
"Electric vehicle charging"
Keywords summarizing the topic.
["ev charging", "charging network"]
Number of source snapshots grouped in this topic.
14
Whether the project’s owned entity has content on this topic.
false
Whether a competitor has content on this topic.
true
Content-gap flag (owned entity absent).
true
Total citations across the topic’s sources within the run’s scope.
128
The topic’s sources, most-cited first.
Show child attributes
Show child attributes