List content gaps
curl --request GET \
--url https://api.usenotra.com/v1/projects/{projectId}/geo/gaps \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.usenotra.com/v1/projects/{projectId}/geo/gaps"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.usenotra.com/v1/projects/{projectId}/geo/gaps', 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.usenotra.com/v1/projects/{projectId}/geo/gaps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.usenotra.com/v1/projects/{projectId}/geo/gaps"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.usenotra.com/v1/projects/{projectId}/geo/gaps")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/v1/projects/{projectId}/geo/gaps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"promptGaps": [
{
"id": "<string>",
"prompt": "<string>",
"title": "<string>",
"engines": [
"<string>"
],
"mentionedEngines": [
"<string>"
],
"competitors": [
"<string>"
],
"discoveredCompetitors": [
"<string>"
],
"searchQueries": [
"<string>"
],
"ownMentionRate": 123,
"engineCoverage": 123,
"opportunity": 123,
"won": true,
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
}
}
],
"searchGaps": [
{
"id": "<string>",
"prompt": "<string>",
"title": "<string>",
"impressions": 123,
"clicks": 123,
"position": 123,
"queries": [
{
"query": "<string>",
"clicks": 123,
"impressions": 123,
"position": 123
}
],
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
},
"recommendation": {
"action": "create",
"reason": "<string>",
"targets": [
{
"kind": "page",
"id": "<string>",
"url": "<string>",
"title": "<string>",
"score": 123
}
]
}
}
],
"aiSearchGaps": [
{
"id": "<string>",
"query": "<string>",
"variants": [
"<string>"
],
"prompts": [
"<string>"
],
"engines": [
"<string>"
],
"searches": 123,
"ownMentionRate": 123,
"competitors": [
"<string>"
],
"discoveredCompetitors": [
"<string>"
],
"opportunity": 123,
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
}
}
],
"hasScanData": true,
"snapshotReady": true,
"organization": {
"id": "<string>",
"slug": "<string>",
"name": "<string>",
"logo": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}List content gaps
Prompts where competitors are mentioned and this brand is not, plus Search Console queries with no tracked prompt. Each row carries the brief already written for it, when there is one.
GET
https://api.usenotra.com
/
v1
/
projects
/
{projectId}
/
geo
/
gaps
List content gaps
curl --request GET \
--url https://api.usenotra.com/v1/projects/{projectId}/geo/gaps \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.usenotra.com/v1/projects/{projectId}/geo/gaps"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.usenotra.com/v1/projects/{projectId}/geo/gaps', 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.usenotra.com/v1/projects/{projectId}/geo/gaps",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$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.usenotra.com/v1/projects/{projectId}/geo/gaps"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
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.usenotra.com/v1/projects/{projectId}/geo/gaps")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.usenotra.com/v1/projects/{projectId}/geo/gaps")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"promptGaps": [
{
"id": "<string>",
"prompt": "<string>",
"title": "<string>",
"engines": [
"<string>"
],
"mentionedEngines": [
"<string>"
],
"competitors": [
"<string>"
],
"discoveredCompetitors": [
"<string>"
],
"searchQueries": [
"<string>"
],
"ownMentionRate": 123,
"engineCoverage": 123,
"opportunity": 123,
"won": true,
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
}
}
],
"searchGaps": [
{
"id": "<string>",
"prompt": "<string>",
"title": "<string>",
"impressions": 123,
"clicks": 123,
"position": 123,
"queries": [
{
"query": "<string>",
"clicks": 123,
"impressions": 123,
"position": 123
}
],
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
},
"recommendation": {
"action": "create",
"reason": "<string>",
"targets": [
{
"kind": "page",
"id": "<string>",
"url": "<string>",
"title": "<string>",
"score": 123
}
]
}
}
],
"aiSearchGaps": [
{
"id": "<string>",
"query": "<string>",
"variants": [
"<string>"
],
"prompts": [
"<string>"
],
"engines": [
"<string>"
],
"searches": 123,
"ownMentionRate": 123,
"competitors": [
"<string>"
],
"discoveredCompetitors": [
"<string>"
],
"opportunity": 123,
"brief": {
"briefId": "<string>",
"status": "draft",
"postId": "<string>",
"workingTitle": "<string>",
"publishedAt": "<string>",
"baseline": {
"mentionedEngines": 123,
"totalEngines": 123
},
"rescanned": true
}
}
],
"hasScanData": true,
"snapshotReady": true,
"organization": {
"id": "<string>",
"slug": "<string>",
"name": "<string>",
"logo": "<string>"
}
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}{
"error": "<string>",
"code": "<string>",
"recovery": "<string>"
}Authorizations
Send your API key in the Authorization header as Bearer API_KEY.
Path Parameters
Minimum string length:
1Pattern:
^[A-Za-z0-9_-]{1,100}$Example:
"b1f2c3d4-0000-4000-8000-000000000000"
Response
Gaps fetched successfully
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Web searches AI engines ran in scan answers without mentioning the brand or citing its site.
Show child attributes
Show child attributes
False until the project has at least one scan result.
False while the project's content gaps snapshot is being prepared.
Show child attributes
Show child attributes
Last modified on October 2, 2026
Was this page helpful?