curl --request POST \
--url https://api.peec.ai/customer/v1/reports/brands \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"previous_start_date": "2023-12-25",
"previous_end_date": "2023-12-25",
"dimensions": [
"tag_id",
"model_id"
],
"filters": [
{
"field": "model_id",
"operator": "in",
"values": [
"gpt-4o-search"
]
}
],
"having": [
{
"field": "brand_id",
"operator": "in",
"values": [
"kw_abc123"
]
},
{
"field": "visibility",
"operator": "gte",
"value": 0.1
},
{
"field": "visibility",
"operator": "lte",
"value": 0.9
}
],
"order_by": [
{
"field": "visibility",
"direction": "desc"
}
],
"include_previous_period": true
}
'import requests
url = "https://api.peec.ai/customer/v1/reports/brands"
payload = {
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"previous_start_date": "2023-12-25",
"previous_end_date": "2023-12-25",
"dimensions": ["tag_id", "model_id"],
"filters": [
{
"field": "model_id",
"operator": "in",
"values": ["gpt-4o-search"]
}
],
"having": [
{
"field": "brand_id",
"operator": "in",
"values": ["kw_abc123"]
},
{
"field": "visibility",
"operator": "gte",
"value": 0.1
},
{
"field": "visibility",
"operator": "lte",
"value": 0.9
}
],
"order_by": [
{
"field": "visibility",
"direction": "desc"
}
],
"include_previous_period": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
project_id: 'or_f45b94ba-5e35-4982-93ed-285e72ee14eb',
limit: 1000,
offset: 0,
start_date: '2025-09-22',
end_date: '2025-09-22',
previous_start_date: '2023-12-25',
previous_end_date: '2023-12-25',
dimensions: ['tag_id', 'model_id'],
filters: [{field: 'model_id', operator: 'in', values: ['gpt-4o-search']}],
having: [
{field: 'brand_id', operator: 'in', values: ['kw_abc123']},
{field: 'visibility', operator: 'gte', value: 0.1},
{field: 'visibility', operator: 'lte', value: 0.9}
],
order_by: [{field: 'visibility', direction: 'desc'}],
include_previous_period: true
})
};
fetch('https://api.peec.ai/customer/v1/reports/brands', 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.peec.ai/customer/v1/reports/brands",
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([
'project_id' => 'or_f45b94ba-5e35-4982-93ed-285e72ee14eb',
'limit' => 1000,
'offset' => 0,
'start_date' => '2025-09-22',
'end_date' => '2025-09-22',
'previous_start_date' => '2023-12-25',
'previous_end_date' => '2023-12-25',
'dimensions' => [
'tag_id',
'model_id'
],
'filters' => [
[
'field' => 'model_id',
'operator' => 'in',
'values' => [
'gpt-4o-search'
]
]
],
'having' => [
[
'field' => 'brand_id',
'operator' => 'in',
'values' => [
'kw_abc123'
]
],
[
'field' => 'visibility',
'operator' => 'gte',
'value' => 0.1
],
[
'field' => 'visibility',
'operator' => 'lte',
'value' => 0.9
]
],
'order_by' => [
[
'field' => 'visibility',
'direction' => 'desc'
]
],
'include_previous_period' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.peec.ai/customer/v1/reports/brands"
payload := strings.NewReader("{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.peec.ai/customer/v1/reports/brands")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peec.ai/customer/v1/reports/brands")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"brand": {
"id": "kw_915e742b-396d-4a86-ad57-8bc84e8c2232",
"name": "Peec AI"
},
"mention_count": 42,
"visibility": 0.5,
"visibility_count": 5,
"visibility_total": 10,
"prompt": {
"id": "pr_93f790de-5b7a-45ee-b782-61103c81f20d"
},
"model": {
"id": "gpt-4o-search"
},
"model_channel": {
"id": "openai-1"
},
"tag": {
"id": "tg_23abec5b-100a-4261-9ee7-1effe68f0149"
},
"topic": {
"id": "to_e6b8cdd3-a51b-4d94-a866-28dbe6b830a6"
},
"country_code": "US",
"chat": {
"id": "ch_abc123"
},
"date": "2025-03-15",
"week": "2025-03-10",
"month": "2025-03-01",
"share_of_voice": 0.15,
"win_rate": 0.2,
"win_count": 2,
"sentiment": 50,
"sentiment_sum": 0,
"sentiment_count": 10,
"position": 1.5,
"position_sum": 15,
"position_count": 10,
"previous": {
"mention_count": 42,
"visibility": 0.5,
"visibility_count": 5,
"visibility_total": 10,
"date": "2025-03-15",
"share_of_voice": 0.15,
"win_rate": 0.2,
"win_count": 2,
"sentiment": 50,
"sentiment_sum": 0,
"sentiment_count": 10,
"position": 1.5,
"position_sum": 15,
"position_count": 10
}
}
]
}Get Brands Report
Get a report on Brands.
Prompt Scope
The report covers the project’s active prompts. An archived prompt is counted only when filters selects it with a prompt_id in predicate; a not_in filter or a having predicate does not bring it back.
Aggregation Formulas
When aggregating results across multiple rows/dimensions, use the following formulas:
- sentiment:
((sum(sentiment_sum) / sum(sentiment_count)) / 2 + 0.5) * 100 - position:
sum(position_sum) / sum(position_count) - visibility:
sum(visibility_count) / sum(visibility_total) - share_of_voice:
mention_count / sum(mention_count) - win_rate:
sum(win_count) / sum(visibility_total)
filters vs having
filters are pre-aggregation row filters (applied as WHERE before GROUP BY). They shrink both the numerator and the denominator of ratio metrics. Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, brand_id. Note that brand_id in filters shrinks share_of_voice’s denominator too — so filtering to one brand collapses SoV to 1.0. Use having for brand_id if you want SoV preserved.
having are post-aggregation row filters (applied as HAVING after GROUP BY). They select which aggregated rows are returned and do not shrink ratio-metric denominators. Filtering {field: "brand_id", values: [X]} here returns only brand X’s row, but share_of_voice still divides X’s mentions by mentions across all in-scope brands — so SoV stays in [0, 1]. Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, brand_id.
Population fields (model_id etc.) are also allowed in having but require the matching value in dimensions so the column appears in GROUP BY; otherwise the request is rejected.
When dimensions are requested, the share_of_voice denominator follows the same grouping as the numerator. Requesting prompt_id as a dimension produces per-(brand × prompt) rows whose share_of_voice is the brand’s mentions in that prompt divided by all brands’ mentions in that prompt.
curl --request POST \
--url https://api.peec.ai/customer/v1/reports/brands \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"previous_start_date": "2023-12-25",
"previous_end_date": "2023-12-25",
"dimensions": [
"tag_id",
"model_id"
],
"filters": [
{
"field": "model_id",
"operator": "in",
"values": [
"gpt-4o-search"
]
}
],
"having": [
{
"field": "brand_id",
"operator": "in",
"values": [
"kw_abc123"
]
},
{
"field": "visibility",
"operator": "gte",
"value": 0.1
},
{
"field": "visibility",
"operator": "lte",
"value": 0.9
}
],
"order_by": [
{
"field": "visibility",
"direction": "desc"
}
],
"include_previous_period": true
}
'import requests
url = "https://api.peec.ai/customer/v1/reports/brands"
payload = {
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"previous_start_date": "2023-12-25",
"previous_end_date": "2023-12-25",
"dimensions": ["tag_id", "model_id"],
"filters": [
{
"field": "model_id",
"operator": "in",
"values": ["gpt-4o-search"]
}
],
"having": [
{
"field": "brand_id",
"operator": "in",
"values": ["kw_abc123"]
},
{
"field": "visibility",
"operator": "gte",
"value": 0.1
},
{
"field": "visibility",
"operator": "lte",
"value": 0.9
}
],
"order_by": [
{
"field": "visibility",
"direction": "desc"
}
],
"include_previous_period": True
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
project_id: 'or_f45b94ba-5e35-4982-93ed-285e72ee14eb',
limit: 1000,
offset: 0,
start_date: '2025-09-22',
end_date: '2025-09-22',
previous_start_date: '2023-12-25',
previous_end_date: '2023-12-25',
dimensions: ['tag_id', 'model_id'],
filters: [{field: 'model_id', operator: 'in', values: ['gpt-4o-search']}],
having: [
{field: 'brand_id', operator: 'in', values: ['kw_abc123']},
{field: 'visibility', operator: 'gte', value: 0.1},
{field: 'visibility', operator: 'lte', value: 0.9}
],
order_by: [{field: 'visibility', direction: 'desc'}],
include_previous_period: true
})
};
fetch('https://api.peec.ai/customer/v1/reports/brands', 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.peec.ai/customer/v1/reports/brands",
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([
'project_id' => 'or_f45b94ba-5e35-4982-93ed-285e72ee14eb',
'limit' => 1000,
'offset' => 0,
'start_date' => '2025-09-22',
'end_date' => '2025-09-22',
'previous_start_date' => '2023-12-25',
'previous_end_date' => '2023-12-25',
'dimensions' => [
'tag_id',
'model_id'
],
'filters' => [
[
'field' => 'model_id',
'operator' => 'in',
'values' => [
'gpt-4o-search'
]
]
],
'having' => [
[
'field' => 'brand_id',
'operator' => 'in',
'values' => [
'kw_abc123'
]
],
[
'field' => 'visibility',
'operator' => 'gte',
'value' => 0.1
],
[
'field' => 'visibility',
'operator' => 'lte',
'value' => 0.9
]
],
'order_by' => [
[
'field' => 'visibility',
'direction' => 'desc'
]
],
'include_previous_period' => true
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <api-key>"
],
]);
$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.peec.ai/customer/v1/reports/brands"
payload := strings.NewReader("{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
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.peec.ai/customer/v1/reports/brands")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peec.ai/customer/v1/reports/brands")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"project_id\": \"or_f45b94ba-5e35-4982-93ed-285e72ee14eb\",\n \"limit\": 1000,\n \"offset\": 0,\n \"start_date\": \"2025-09-22\",\n \"end_date\": \"2025-09-22\",\n \"previous_start_date\": \"2023-12-25\",\n \"previous_end_date\": \"2023-12-25\",\n \"dimensions\": [\n \"tag_id\",\n \"model_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_id\",\n \"operator\": \"in\",\n \"values\": [\n \"gpt-4o-search\"\n ]\n }\n ],\n \"having\": [\n {\n \"field\": \"brand_id\",\n \"operator\": \"in\",\n \"values\": [\n \"kw_abc123\"\n ]\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"gte\",\n \"value\": 0.1\n },\n {\n \"field\": \"visibility\",\n \"operator\": \"lte\",\n \"value\": 0.9\n }\n ],\n \"order_by\": [\n {\n \"field\": \"visibility\",\n \"direction\": \"desc\"\n }\n ],\n \"include_previous_period\": true\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"brand": {
"id": "kw_915e742b-396d-4a86-ad57-8bc84e8c2232",
"name": "Peec AI"
},
"mention_count": 42,
"visibility": 0.5,
"visibility_count": 5,
"visibility_total": 10,
"prompt": {
"id": "pr_93f790de-5b7a-45ee-b782-61103c81f20d"
},
"model": {
"id": "gpt-4o-search"
},
"model_channel": {
"id": "openai-1"
},
"tag": {
"id": "tg_23abec5b-100a-4261-9ee7-1effe68f0149"
},
"topic": {
"id": "to_e6b8cdd3-a51b-4d94-a866-28dbe6b830a6"
},
"country_code": "US",
"chat": {
"id": "ch_abc123"
},
"date": "2025-03-15",
"week": "2025-03-10",
"month": "2025-03-01",
"share_of_voice": 0.15,
"win_rate": 0.2,
"win_count": 2,
"sentiment": 50,
"sentiment_sum": 0,
"sentiment_count": 10,
"position": 1.5,
"position_sum": 15,
"position_count": 10,
"previous": {
"mention_count": 42,
"visibility": 0.5,
"visibility_count": 5,
"visibility_total": 10,
"date": "2025-03-15",
"share_of_voice": 0.15,
"win_rate": 0.2,
"win_count": 2,
"sentiment": 50,
"sentiment_sum": 0,
"sentiment_count": 10,
"position": 1.5,
"position_sum": 15,
"position_count": 10
}
}
]
}Authorizations
Query Parameters
Required if using a company api key
"or_f45b94ba-5e35-4982-93ed-285e72ee14eb"
Body
Required if using a company api key
"or_f45b94ba-5e35-4982-93ed-285e72ee14eb"
1 <= x <= 100000 <= x <= 500000full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$"2025-09-22"
full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$"2025-09-22"
Start of an explicit comparison window for deltas. Provide together with previous_end_date, or omit both to auto-derive an equal-length window immediately before [start_date, end_date].
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$End of the explicit comparison window. Provide together with previous_start_date, or omit both to auto-derive.
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$Dimensions to break down the report by.
prompt_id, model_id, model_channel_id, tag_id, topic_id, date, week, month, country_code, chat_id ["tag_id", "model_id"]
Pre-aggregation row filters (applied as WHERE before grouping). Shrinks both the numerator and the denominator of ratio metrics. Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, brand_id. Filtering by brand_id here also shrinks share_of_voice's denominator — so SoV collapses to 1.0 when scoping to a single brand. If you want SoV preserved (X's share against all in-scope brands), put brand_id in having instead. Multiple filters are AND'd.
Deprecated: use model_channel_id filter instead
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
- Option 10
Show child attributes
Show child attributes
[
{
"field": "model_id",
"operator": "in",
"values": ["gpt-4o-search"]
}
]
Post-aggregation row filters (applied as HAVING after grouping). Selects which aggregated rows are returned without shrinking ratio-metric denominators. Multiple filters are AND'd together.
Population fields — model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id — and brand_id take {field, operator, values} with operator in or not_in. Population fields require the matching value in dimensions so the column appears in GROUP BY.
Metric fields — visibility, share_of_voice, win_rate, sentiment, position — take {field, operator, value} with operator gt, gte, lt or lte, and need no matching dimensions entry. Each compares against the metric in the unit this endpoint returns it: visibility, share_of_voice and win_rate as a 0-1 ratio, sentiment as a 0-100 score, position as a rank where 1 is best. Values are validated against that unit, so a percentage where a ratio belongs is rejected rather than silently matching nothing. Two predicates on one field make a range; stating the same edge of a field twice, or a range no row could satisfy, is rejected. A row whose metric is undefined — no position or sentiment samples in the window — matches neither.
A metric predicate tests whichever row the grouping produces, so the same predicate asks a different question at each grouping: with dimensions: ["prompt_id"] it selects the prompts that individually pass, and with no dimensions it tests the brand's rolled-up totals.
Deprecated: use model_channel_id filter instead
- Option 1
- Option 2
- Option 3
- Option 4
- Option 5
- Option 6
- Option 7
- Option 8
- Option 9
Show child attributes
Show child attributes
[
{
"field": "brand_id",
"operator": "in",
"values": ["kw_abc123"]
},
{
"field": "visibility",
"operator": "gte",
"value": 0.1
},
{
"field": "visibility",
"operator": "lte",
"value": 0.9
}
]
Sort results by one or more fields. Multiple entries create a multi-key sort. Direction defaults to desc. When omitted, a default ordering is applied.
Show child attributes
Show child attributes
[
{
"field": "visibility",
"direction": "desc"
}
]
Legacy comparison switch. When true without explicit comparison dates, each row gains a previous object computed over the adjacent equal-length window. Supplying previous_start_date and previous_end_date enables comparison over that exact window without this flag.
Response
Success
Success
Show child attributes
Show child attributes
