curl --request POST \
--url https://api.athenahq.ai/api/v1/attributes/observations \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"website_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"schedule_id": "default",
"end_date": "2024-12-31T23:59:59.999Z",
"models": [
"chatgpt",
"perplexity"
],
"prompt_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"location_ids": [
"123e4567-e89b-12d3-a456-426614174111"
]
},
"entity_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"attribute_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"positive": true,
"sort": "intensity",
"page_num": 0,
"page_size": 40
}
'import requests
url = "https://api.athenahq.ai/api/v1/attributes/observations"
payload = {
"website_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"schedule_id": "default",
"end_date": "2024-12-31T23:59:59.999Z",
"models": ["chatgpt", "perplexity"],
"prompt_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"location_ids": ["123e4567-e89b-12d3-a456-426614174111"]
},
"entity_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"attribute_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"positive": True,
"sort": "intensity",
"page_num": 0,
"page_size": 40
}
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({
website_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
filters: {
start_date: '2024-01-01T00:00:00.000Z',
schedule_id: 'default',
end_date: '2024-12-31T23:59:59.999Z',
models: ['chatgpt', 'perplexity'],
prompt_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
location_ids: ['123e4567-e89b-12d3-a456-426614174111']
},
entity_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
attribute_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
positive: true,
sort: 'intensity',
page_num: 0,
page_size: 40
})
};
fetch('https://api.athenahq.ai/api/v1/attributes/observations', 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.athenahq.ai/api/v1/attributes/observations",
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([
'website_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'filters' => [
'start_date' => '2024-01-01T00:00:00.000Z',
'schedule_id' => 'default',
'end_date' => '2024-12-31T23:59:59.999Z',
'models' => [
'chatgpt',
'perplexity'
],
'prompt_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'location_ids' => [
'123e4567-e89b-12d3-a456-426614174111'
]
],
'entity_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'attribute_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'positive' => true,
'sort' => 'intensity',
'page_num' => 0,
'page_size' => 40
]),
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.athenahq.ai/api/v1/attributes/observations"
payload := strings.NewReader("{\n \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\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.athenahq.ai/api/v1/attributes/observations")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.athenahq.ai/api/v1/attributes/observations")
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 \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"observation_id": "0b7c3f7e-2d4a-4c1e-9f3b-6a2e8d1c4b5a",
"response_id": "7d9e1a2b-3c4d-4e5f-8a6b-9c0d1e2f3a4b",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_name": "Acme",
"is_website": true,
"attribute_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"attribute_name": "Affordable",
"positive": true,
"score": 0.9,
"text_span": "Acme is by far the most affordable option for small teams.",
"model": "chatgpt",
"created_at": "2026-09-14T08:21:05Z"
},
{
"observation_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"response_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"entity_id": "1f2e3d4c-5b6a-4798-8a9b-0c1d2e3f4a5b",
"entity_name": "Globex",
"is_website": false,
"attribute_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"attribute_name": "Affordable",
"positive": false,
"score": null,
"text_span": "Globex is priced above most alternatives.",
"model": "perplexity",
"created_at": "2026-08-02T17:44:39Z"
}
],
"page_num": 0,
"page_size": 40,
"has_more": false
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}Attribute Observations
Returns individual brand trait observations: each row is one statement an AI response made about one entity (your brand or a competitor) for one attribute, with the supporting response excerpt as text_span. score runs from -1 to 1 and its sign always matches positive; its magnitude (0.1 to 1.0) is how strongly the wording praises or criticizes. score is null when the observation was not scored, because it was extracted before scoring existed or has no valid value. If you only need the direction, use score ?? (positive ? 1 : -1). Omit positive for both directions. sort: "intensity" (the default) returns the strongest observations first with unscored ones last; sort: "recent" returns the newest first. A page can hold fewer than page_size rows when an excerpt is no longer available, so use has_more to decide whether to fetch the next page. Also available as the MCP tool get_attribute_observations.
curl --request POST \
--url https://api.athenahq.ai/api/v1/attributes/observations \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"website_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"schedule_id": "default",
"end_date": "2024-12-31T23:59:59.999Z",
"models": [
"chatgpt",
"perplexity"
],
"prompt_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"location_ids": [
"123e4567-e89b-12d3-a456-426614174111"
]
},
"entity_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"attribute_ids": [
"3c90c3cc-0d44-4b50-8888-8dd25736052a"
],
"positive": true,
"sort": "intensity",
"page_num": 0,
"page_size": 40
}
'import requests
url = "https://api.athenahq.ai/api/v1/attributes/observations"
payload = {
"website_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"schedule_id": "default",
"end_date": "2024-12-31T23:59:59.999Z",
"models": ["chatgpt", "perplexity"],
"prompt_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"location_ids": ["123e4567-e89b-12d3-a456-426614174111"]
},
"entity_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"attribute_ids": ["3c90c3cc-0d44-4b50-8888-8dd25736052a"],
"positive": True,
"sort": "intensity",
"page_num": 0,
"page_size": 40
}
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({
website_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
filters: {
start_date: '2024-01-01T00:00:00.000Z',
schedule_id: 'default',
end_date: '2024-12-31T23:59:59.999Z',
models: ['chatgpt', 'perplexity'],
prompt_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
location_ids: ['123e4567-e89b-12d3-a456-426614174111']
},
entity_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
attribute_ids: ['3c90c3cc-0d44-4b50-8888-8dd25736052a'],
positive: true,
sort: 'intensity',
page_num: 0,
page_size: 40
})
};
fetch('https://api.athenahq.ai/api/v1/attributes/observations', 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.athenahq.ai/api/v1/attributes/observations",
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([
'website_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'filters' => [
'start_date' => '2024-01-01T00:00:00.000Z',
'schedule_id' => 'default',
'end_date' => '2024-12-31T23:59:59.999Z',
'models' => [
'chatgpt',
'perplexity'
],
'prompt_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'location_ids' => [
'123e4567-e89b-12d3-a456-426614174111'
]
],
'entity_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'attribute_ids' => [
'3c90c3cc-0d44-4b50-8888-8dd25736052a'
],
'positive' => true,
'sort' => 'intensity',
'page_num' => 0,
'page_size' => 40
]),
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.athenahq.ai/api/v1/attributes/observations"
payload := strings.NewReader("{\n \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\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.athenahq.ai/api/v1/attributes/observations")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.athenahq.ai/api/v1/attributes/observations")
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 \"website_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"schedule_id\": \"default\",\n \"end_date\": \"2024-12-31T23:59:59.999Z\",\n \"models\": [\n \"chatgpt\",\n \"perplexity\"\n ],\n \"prompt_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"location_ids\": [\n \"123e4567-e89b-12d3-a456-426614174111\"\n ]\n },\n \"entity_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"attribute_ids\": [\n \"3c90c3cc-0d44-4b50-8888-8dd25736052a\"\n ],\n \"positive\": true,\n \"sort\": \"intensity\",\n \"page_num\": 0,\n \"page_size\": 40\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"observation_id": "0b7c3f7e-2d4a-4c1e-9f3b-6a2e8d1c4b5a",
"response_id": "7d9e1a2b-3c4d-4e5f-8a6b-9c0d1e2f3a4b",
"entity_id": "123e4567-e89b-12d3-a456-426614174000",
"entity_name": "Acme",
"is_website": true,
"attribute_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"attribute_name": "Affordable",
"positive": true,
"score": 0.9,
"text_span": "Acme is by far the most affordable option for small teams.",
"model": "chatgpt",
"created_at": "2026-09-14T08:21:05Z"
},
{
"observation_id": "5e6f7a8b-9c0d-4e1f-8a2b-3c4d5e6f7a8b",
"response_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
"entity_id": "1f2e3d4c-5b6a-4798-8a9b-0c1d2e3f4a5b",
"entity_name": "Globex",
"is_website": false,
"attribute_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"attribute_name": "Affordable",
"positive": false,
"score": null,
"text_span": "Globex is priced above most alternatives.",
"model": "perplexity",
"created_at": "2026-08-02T17:44:39Z"
}
],
"page_num": 0,
"page_size": 40,
"has_more": false
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}{
"error": "Unauthorized"
}Body
The shared filters without competitor_ids, for the brand trait endpoints that do not take it: /api/v1/attributes/cumulative is brand-only, and /api/v1/attributes/observations selects entities with entity_ids. Sending competitor_ids is rejected. Use /api/v1/attributes/competitors for per-competitor metrics.
Show child attributes
Show child attributes
Entities to return observations for: the website_id for your brand, or competitor ids from GET /api/v1/competitors. Omit for every entity.
100Attributes to return observations for, from GET /api/v1/attributes. Omit for every active attribute.
100true for favorable observations only, false for critical ones only. Omit for both directions.
intensity: strongest first, unscored last, then newest. recent: newest first.
intensity, recent Zero-indexed page number.
x >= 0Rows per page.
1 <= x <= 100Was this page helpful?