curl --request GET \
--url https://data.otterly.ai/v1/reports/brand/{reportId}/stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.otterly.ai/v1/reports/brand/{reportId}/stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.otterly.ai/v1/reports/brand/{reportId}/stats', 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://data.otterly.ai/v1/reports/brand/{reportId}/stats",
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://data.otterly.ai/v1/reports/brand/{reportId}/stats"
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://data.otterly.ai/v1/reports/brand/{reportId}/stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.otterly.ai/v1/reports/brand/{reportId}/stats")
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{
"id": "<string>",
"status": "<string>",
"isRecalculating": true,
"totalPrompts": 1,
"brand": {
"brand": "<string>",
"brandDomain": "<string>",
"brandDomainWildcard": true
},
"summary": {
"averageRank": 123,
"averagePosition": 123,
"totalMentions": 1,
"totalSources": 1,
"shareOfVoice": 123,
"brandCoverage": 123,
"domainCoverage": 123
},
"detectedBrands": [
{
"name": "<string>",
"mentions": 123
}
],
"allBrandsAnalysis": {
"brandMentions": [
{
"brand": "<string>",
"isMainBrand": true,
"rank": 123,
"mentions": 123,
"shareOfVoice": 123,
"brandCoverage": 123
}
],
"brandRankHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"rank": 123
}
]
}
],
"brandCoverageHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"brandPositionHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"position": 123
}
]
}
],
"brandVisibilityIndex": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"visibilityScore": 123,
"brandCoverage": 123,
"likelihoodToBuy": 123
}
]
}
],
"domainCoverageHistory": [
{
"date": "<string>",
"domains": [
{
"domain": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
]
},
"competitorBrandsAnalysis": {
"brandMentions": [
{
"brand": "<string>",
"domain": "<string>",
"logoUrl": "<string>",
"isMainBrand": true,
"mentions": 123,
"shareOfVoice": 123,
"brandCoverage": 123,
"domainCoverage": 123,
"domainCitations": 123,
"averageRank": 123,
"averagePosition": 123,
"visibilityScore": 123,
"likelihoodToBuy": 123,
"sentiment": {
"positive": 123,
"neutral": 123,
"negative": 123,
"nss": 123
}
}
],
"brandCoverageHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"domainCoverageHistory": [
{
"date": "<string>",
"domains": [
{
"domain": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"brandVisibilityIndex": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"visibilityScore": 123,
"brandCoverage": 123,
"likelihoodToBuy": 123
}
]
}
]
}
}{
"message": "Validation failed",
"target": "query",
"errors": [
{
"path": "country",
"message": "Required",
"code": "invalid_type"
}
]
}{
"message": "Report not found"
}{
"message": "Report not found"
}{
"message": "Report not found"
}Get statistics for a brand report
curl --request GET \
--url https://data.otterly.ai/v1/reports/brand/{reportId}/stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.otterly.ai/v1/reports/brand/{reportId}/stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://data.otterly.ai/v1/reports/brand/{reportId}/stats', 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://data.otterly.ai/v1/reports/brand/{reportId}/stats",
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://data.otterly.ai/v1/reports/brand/{reportId}/stats"
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://data.otterly.ai/v1/reports/brand/{reportId}/stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.otterly.ai/v1/reports/brand/{reportId}/stats")
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{
"id": "<string>",
"status": "<string>",
"isRecalculating": true,
"totalPrompts": 1,
"brand": {
"brand": "<string>",
"brandDomain": "<string>",
"brandDomainWildcard": true
},
"summary": {
"averageRank": 123,
"averagePosition": 123,
"totalMentions": 1,
"totalSources": 1,
"shareOfVoice": 123,
"brandCoverage": 123,
"domainCoverage": 123
},
"detectedBrands": [
{
"name": "<string>",
"mentions": 123
}
],
"allBrandsAnalysis": {
"brandMentions": [
{
"brand": "<string>",
"isMainBrand": true,
"rank": 123,
"mentions": 123,
"shareOfVoice": 123,
"brandCoverage": 123
}
],
"brandRankHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"rank": 123
}
]
}
],
"brandCoverageHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"brandPositionHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"position": 123
}
]
}
],
"brandVisibilityIndex": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"visibilityScore": 123,
"brandCoverage": 123,
"likelihoodToBuy": 123
}
]
}
],
"domainCoverageHistory": [
{
"date": "<string>",
"domains": [
{
"domain": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
]
},
"competitorBrandsAnalysis": {
"brandMentions": [
{
"brand": "<string>",
"domain": "<string>",
"logoUrl": "<string>",
"isMainBrand": true,
"mentions": 123,
"shareOfVoice": 123,
"brandCoverage": 123,
"domainCoverage": 123,
"domainCitations": 123,
"averageRank": 123,
"averagePosition": 123,
"visibilityScore": 123,
"likelihoodToBuy": 123,
"sentiment": {
"positive": 123,
"neutral": 123,
"negative": 123,
"nss": 123
}
}
],
"brandCoverageHistory": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"domainCoverageHistory": [
{
"date": "<string>",
"domains": [
{
"domain": "<string>",
"isMainBrand": true,
"logoUrl": "<string>",
"coverage": 123
}
]
}
],
"brandVisibilityIndex": [
{
"date": "<string>",
"brands": [
{
"brand": "<string>",
"isMainBrand": true,
"visibilityScore": 123,
"brandCoverage": 123,
"likelihoodToBuy": 123
}
]
}
]
}
}{
"message": "Validation failed",
"target": "query",
"errors": [
{
"path": "country",
"message": "Required",
"code": "invalid_type"
}
]
}{
"message": "Report not found"
}{
"message": "Report not found"
}{
"message": "Report not found"
}Authorizations
Provide your API key as a Bearer token: Authorization: Bearer YOUR_API_KEY.
Path Parameters
Brand report identifier.
1"01HX7K2YV9D3M8N0G6Q5R4S3T2"
Query Parameters
Start date for the stats window (inclusive).
1"2025-01-01"
End date for the stats window (inclusive).
1"2025-01-31"
Country code to filter stats by. Lowercase ISO 3166-1 alpha-2; use uk for the United Kingdom.
1"us"
Optional. AI engine(s) to filter by. Repeat the param or pass a single value.
chatgpt, google, perplexity, copilot, google_ai_mode, gemini, claude "chatgpt"
Optional. Filter stats by tag id.
Response
Statistics for the brand report.
Brand report stats payload: meta, the tracked brand info, summary metrics, detected source brands, and per-analysis aggregates (all detected brands vs configured competitors).
x >= 0Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes