curl --request GET \
--url https://data.otterly.ai/v1/reports/brand/{reportId}/annotations \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.otterly.ai/v1/reports/brand/{reportId}/annotations"
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}/annotations', 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}/annotations",
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}/annotations"
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}/annotations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.otterly.ai/v1/reports/brand/{reportId}/annotations")
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{
"items": [
{
"id": "01HXAN7K2YV9D3M8N0G6Q5R4S3",
"brandReportId": "01HXBR1DGM5XY8Z2N3KQ7VAW4P",
"date": "2025-04-10",
"type": "note",
"text": "Launched spring running campaign",
"createdBy": "4f7a1c2e9b8d4e6f",
"createdDate": "2025-04-10T09:15:00.000Z",
"updatedDate": "2025-04-10T09:15:00.000Z"
}
],
"paging": {
"nextCursor": null,
"hasMore": false
}
}{
"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"
}{
"message": "Report not found"
}List brand report annotations
Returns every annotation on the brand report, notes and recommendation markers, most recently created first. Send startDate and endDate together to return only annotations dated in that range (inclusive), ordered by annotation date, latest first; a lone bound or a startDate after endDate is a 400. Annotations may not show in the dashboard until annotations are enabled there for your account; they are stored and returned by the API either way.
curl --request GET \
--url https://data.otterly.ai/v1/reports/brand/{reportId}/annotations \
--header 'Authorization: Bearer <token>'import requests
url = "https://data.otterly.ai/v1/reports/brand/{reportId}/annotations"
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}/annotations', 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}/annotations",
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}/annotations"
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}/annotations")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://data.otterly.ai/v1/reports/brand/{reportId}/annotations")
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{
"items": [
{
"id": "01HXAN7K2YV9D3M8N0G6Q5R4S3",
"brandReportId": "01HXBR1DGM5XY8Z2N3KQ7VAW4P",
"date": "2025-04-10",
"type": "note",
"text": "Launched spring running campaign",
"createdBy": "4f7a1c2e9b8d4e6f",
"createdDate": "2025-04-10T09:15:00.000Z",
"updatedDate": "2025-04-10T09:15:00.000Z"
}
],
"paging": {
"nextCursor": null,
"hasMore": false
}
}{
"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"
}{
"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
Optional. First day to include (inclusive), YYYY-MM-DD. Send together with endDate.
"2025-04-01"
Optional. Last day to include (inclusive), YYYY-MM-DD. Send together with startDate.
"2025-04-30"