curl --request POST \
--url https://api.athenahq.ai/api/v1/source-pages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"website_id": "123e4567-e89b-12d3-a456-426614174000",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"end_date": "2024-01-31T23:59:59.999Z"
},
"page_size": 30
}
'import requests
url = "https://api.athenahq.ai/api/v1/source-pages"
payload = {
"website_id": "123e4567-e89b-12d3-a456-426614174000",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"end_date": "2024-01-31T23:59:59.999Z"
},
"page_size": 30
}
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: '123e4567-e89b-12d3-a456-426614174000',
filters: {start_date: '2024-01-01T00:00:00.000Z', end_date: '2024-01-31T23:59:59.999Z'},
page_size: 30
})
};
fetch('https://api.athenahq.ai/api/v1/source-pages', 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/source-pages",
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' => '123e4567-e89b-12d3-a456-426614174000',
'filters' => [
'start_date' => '2024-01-01T00:00:00.000Z',
'end_date' => '2024-01-31T23:59:59.999Z'
],
'page_size' => 30
]),
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/source-pages"
payload := strings.NewReader("{\n \"website_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\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/source-pages")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"website_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.athenahq.ai/api/v1/source-pages")
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\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\n}"
response = http.request(request)
puts response.read_bodyList Source Pages (per URL)
Returns individual cited URLs for a website with citation, mention, and impression metrics — one row per normalized_url. Each row also includes a daily_mentions sparkline (citation percentage per day across the date range) and the same source-type classification as POST /api/v1/sources.
Use this when you need URL-level resolution (e.g. drill into which specific articles on a partner domain drove citations). For the root-domain rollup, use POST /api/v1/sources.
curl --request POST \
--url https://api.athenahq.ai/api/v1/source-pages \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"website_id": "123e4567-e89b-12d3-a456-426614174000",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"end_date": "2024-01-31T23:59:59.999Z"
},
"page_size": 30
}
'import requests
url = "https://api.athenahq.ai/api/v1/source-pages"
payload = {
"website_id": "123e4567-e89b-12d3-a456-426614174000",
"filters": {
"start_date": "2024-01-01T00:00:00.000Z",
"end_date": "2024-01-31T23:59:59.999Z"
},
"page_size": 30
}
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: '123e4567-e89b-12d3-a456-426614174000',
filters: {start_date: '2024-01-01T00:00:00.000Z', end_date: '2024-01-31T23:59:59.999Z'},
page_size: 30
})
};
fetch('https://api.athenahq.ai/api/v1/source-pages', 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/source-pages",
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' => '123e4567-e89b-12d3-a456-426614174000',
'filters' => [
'start_date' => '2024-01-01T00:00:00.000Z',
'end_date' => '2024-01-31T23:59:59.999Z'
],
'page_size' => 30
]),
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/source-pages"
payload := strings.NewReader("{\n \"website_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\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/source-pages")
.header("x-api-key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"website_id\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.athenahq.ai/api/v1/source-pages")
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\": \"123e4567-e89b-12d3-a456-426614174000\",\n \"filters\": {\n \"start_date\": \"2024-01-01T00:00:00.000Z\",\n \"end_date\": \"2024-01-31T23:59:59.999Z\"\n },\n \"page_size\": 30\n}"
response = http.request(request)
puts response.read_bodyBody
Request body for listing per-URL cited pages.
The website to list cited URLs for.
"123e4567-e89b-12d3-a456-426614174000"
Filters for querying responses and metrics. Pass location filters in the JSON body as filters.location_ids.
Show child attributes
Show child attributes
x >= 01 <= x <= 100citation_percentage, estimated_impressions, total_mentions, mentions_count, normalized_url, competitor_ids, first_seen asc, desc Substring filter on normalized_url AND normalized_root_domain. Protocol (https://), www., query, and fragment are stripped before matching; path is preserved so URL-specific searches still work.
If yes, only count sources where your brand was mentioned in the citing response. If no, only count sources where your brand was NOT mentioned. Omit the field to count every cited source.
yes, no If yes, only count sources where your brand was mentioned in the citing response. If no, only count sources where your brand was NOT mentioned. Omit the field to count every cited source.
yes, no Response
Successful response with the page of cited URLs.
Show child attributes
Show child attributes
Pagination metadata. Unlike Pagination (which uses has_more lookahead), the sources surfaces expose a precise total count — the underlying ClickHouse query computes it as a window function in the same scan, so there's no extra round-trip cost.
Show child attributes
Show child attributes
Was this page helpful?