curl --request POST \
--url https://api.peec.ai/customer/v1/reports/links \
--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",
"dimensions": [
"prompt_id"
],
"filters": [
{
"field": "model_channel_id",
"operator": "in",
"values": [
"openai-0"
]
}
],
"order_by": [
{
"field": "linked_chat_count",
"direction": "desc"
}
]
}
'import requests
url = "https://api.peec.ai/customer/v1/reports/links"
payload = {
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"dimensions": ["prompt_id"],
"filters": [
{
"field": "model_channel_id",
"operator": "in",
"values": ["openai-0"]
}
],
"order_by": [
{
"field": "linked_chat_count",
"direction": "desc"
}
]
}
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',
dimensions: ['prompt_id'],
filters: [{field: 'model_channel_id', operator: 'in', values: ['openai-0']}],
order_by: [{field: 'linked_chat_count', direction: 'desc'}]
})
};
fetch('https://api.peec.ai/customer/v1/reports/links', 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/links",
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',
'dimensions' => [
'prompt_id'
],
'filters' => [
[
'field' => 'model_channel_id',
'operator' => 'in',
'values' => [
'openai-0'
]
]
],
'order_by' => [
[
'field' => 'linked_chat_count',
'direction' => 'desc'
]
]
]),
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/links"
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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\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/links")
.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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peec.ai/customer/v1/reports/links")
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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"domain": "acme.com",
"classification": "COMPETITOR",
"linked_chat_count": 18,
"linked_percentage": 0.6,
"link_count": 24,
"average_link_position": 1.4,
"total_chat_count": 30,
"url": "https://acme.com/pricing",
"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": "<string>",
"week": "2025-03-10",
"month": "2025-03-01"
}
]
}Get Links Report
Get a report on the domains AI answers linked to in their own text. A link is a URL the answer wrote into its prose; it is never one of the sources the answer retrieved or cited, which the domains report covers.
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.
Aggregation Formulas
When aggregating results across multiple rows/dimensions:
- linked_percentage:
sum(linked_chat_count) / sum(total_chat_count), only across rows that do not split the same chats (not acrossurlrows of one domain). - average_link_position is not additive across rows. Request the coarser breakdown instead.
curl --request POST \
--url https://api.peec.ai/customer/v1/reports/links \
--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",
"dimensions": [
"prompt_id"
],
"filters": [
{
"field": "model_channel_id",
"operator": "in",
"values": [
"openai-0"
]
}
],
"order_by": [
{
"field": "linked_chat_count",
"direction": "desc"
}
]
}
'import requests
url = "https://api.peec.ai/customer/v1/reports/links"
payload = {
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"dimensions": ["prompt_id"],
"filters": [
{
"field": "model_channel_id",
"operator": "in",
"values": ["openai-0"]
}
],
"order_by": [
{
"field": "linked_chat_count",
"direction": "desc"
}
]
}
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',
dimensions: ['prompt_id'],
filters: [{field: 'model_channel_id', operator: 'in', values: ['openai-0']}],
order_by: [{field: 'linked_chat_count', direction: 'desc'}]
})
};
fetch('https://api.peec.ai/customer/v1/reports/links', 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/links",
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',
'dimensions' => [
'prompt_id'
],
'filters' => [
[
'field' => 'model_channel_id',
'operator' => 'in',
'values' => [
'openai-0'
]
]
],
'order_by' => [
[
'field' => 'linked_chat_count',
'direction' => 'desc'
]
]
]),
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/links"
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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\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/links")
.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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.peec.ai/customer/v1/reports/links")
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 \"dimensions\": [\n \"prompt_id\"\n ],\n \"filters\": [\n {\n \"field\": \"model_channel_id\",\n \"operator\": \"in\",\n \"values\": [\n \"openai-0\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"linked_chat_count\",\n \"direction\": \"desc\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"data": [
{
"domain": "acme.com",
"classification": "COMPETITOR",
"linked_chat_count": 18,
"linked_percentage": 0.6,
"link_count": 24,
"average_link_position": 1.4,
"total_chat_count": 30,
"url": "https://acme.com/pricing",
"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": "<string>",
"week": "2025-03-10",
"month": "2025-03-01"
}
]
}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 <= 9007199254740991full-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"
Dimensions to break down the report by. url breaks each linked domain down into the pages linked.
prompt_id, model_id, model_channel_id, tag_id, topic_id, date, week, month, country_code, chat_id, url ["prompt_id"]
Row filters applied before aggregation. Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, domain, url. Population fields (model/country/prompt/tag/topic/chat) shrink both the linked chats and total_chat_count; domain and url narrow the linked chats only. 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
Show child attributes
Show child attributes
[
{
"field": "model_channel_id",
"operator": "in",
"values": ["openai-0"]
}
]
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": "linked_chat_count",
"direction": "desc"
}
]
Response
Success
Success
Show child attributes
Show child attributes
