Skip to main content
POST
/
reports
/
domains
Get Domains Report
curl --request POST \
  --url https://api.peec.ai/customer/v1/reports/domains \
  --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": [
    "tag_id",
    "model_id"
  ],
  "filters": [
    {
      "field": "model_id",
      "operator": "in",
      "values": [
        "gpt-4o-search"
      ]
    }
  ],
  "having": [
    {
      "field": "domain",
      "operator": "in",
      "values": [
        "example.com"
      ]
    }
  ],
  "order_by": [
    {
      "field": "citation_rate",
      "direction": "desc"
    }
  ]
}
'
import requests

url = "https://api.peec.ai/customer/v1/reports/domains"

payload = {
"project_id": "or_f45b94ba-5e35-4982-93ed-285e72ee14eb",
"limit": 1000,
"offset": 0,
"start_date": "2025-09-22",
"end_date": "2025-09-22",
"dimensions": ["tag_id", "model_id"],
"filters": [
{
"field": "model_id",
"operator": "in",
"values": ["gpt-4o-search"]
}
],
"having": [
{
"field": "domain",
"operator": "in",
"values": ["example.com"]
}
],
"order_by": [
{
"field": "citation_rate",
"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: ['tag_id', 'model_id'],
filters: [{field: 'model_id', operator: 'in', values: ['gpt-4o-search']}],
having: [{field: 'domain', operator: 'in', values: ['example.com']}],
order_by: [{field: 'citation_rate', direction: 'desc'}]
})
};

fetch('https://api.peec.ai/customer/v1/reports/domains', 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/domains",
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' => [
'tag_id',
'model_id'
],
'filters' => [
[
'field' => 'model_id',
'operator' => 'in',
'values' => [
'gpt-4o-search'
]
]
],
'having' => [
[
'field' => 'domain',
'operator' => 'in',
'values' => [
'example.com'
]
]
],
'order_by' => [
[
'field' => 'citation_rate',
'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/domains"

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 \"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\": \"domain\",\n \"operator\": \"in\",\n \"values\": [\n \"example.com\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"citation_rate\",\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/domains")
.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 \"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\": \"domain\",\n \"operator\": \"in\",\n \"values\": [\n \"example.com\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"citation_rate\",\n \"direction\": \"desc\"\n }\n ]\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.peec.ai/customer/v1/reports/domains")

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 \"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\": \"domain\",\n \"operator\": \"in\",\n \"values\": [\n \"example.com\"\n ]\n }\n ],\n \"order_by\": [\n {\n \"field\": \"citation_rate\",\n \"direction\": \"desc\"\n }\n ]\n}"

response = http.request(request)
puts response.read_body
{
  "data": [
    {
      "domain": "example.com",
      "classification": "UGC",
      "usage_rate": 0.8,
      "citation_avg": 2.5,
      "retrieved_percentage": 0.6,
      "retrieval_rate": 1.2,
      "citation_rate": 1.5,
      "retrieval_count": 24,
      "citation_count": 12,
      "retrieved_chat_count": 18,
      "total_chat_count": 30,
      "mentioned_brands": [
        {
          "id": "<string>"
        }
      ],
      "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

X-API-Key
string
header
required

Query Parameters

project_id
string

Required if using a company api key

Example:

"or_f45b94ba-5e35-4982-93ed-285e72ee14eb"

Body

project_id
string

Required if using a company api key

Example:

"or_f45b94ba-5e35-4982-93ed-285e72ee14eb"

limit
number
default:1000
Required range: 1 <= x <= 10000
offset
number
default:0
Required range: x >= 0
start_date
string<date>
default:2026-01-01

full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21

Pattern: ^(?:(?:\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])))$
Example:

"2025-09-22"

end_date
string<date>
default:2026-01-01

full-date notation as defined by RFC 3339, section 5.6, for example, 2017-07-21

Pattern: ^(?:(?:\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])))$
Example:

"2025-09-22"

dimensions
enum<string>[]

Dimensions to break down the report by.

Available options:
prompt_id,
model_id,
model_channel_id,
tag_id,
topic_id,
date,
week,
month,
country_code,
chat_id
Example:
["tag_id", "model_id"]
filters
object[]

Pre-aggregation row filters (applied as WHERE before grouping). Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, domain, domain_classification, url, url_classification, mentioned_brand_id, mentioned_brand_count, gap. Population fields (model/country/prompt/tag/topic/chat) shrink both numerator and denominator. Source-side fields and per-row mentioned-brand predicates shrink the source-row scope feeding aggregation; total_chat_count comes from a chat-level table that doesn't carry these columns, so they narrow the numerator only. Multiple filters are AND'd.

Deprecated: use model_channel_id filter instead

Example:
[
{
"field": "model_id",
"operator": "in",
"values": ["gpt-4o-search"]
}
]
having
object[]

Post-aggregation row filters (applied as HAVING after grouping). Select which aggregated domain rows are returned. Allowed fields: model_id (deprecated), model_channel_id, country_code, prompt_id, tag_id, topic_id, chat_id, domain, domain_classification, mentioned_brand_id, mentioned_brand_count, gap — population fields require the matching value in dimensions. Multiple filters are AND'd.

Deprecated: use model_channel_id filter instead

Example:
[
{
"field": "domain",
"operator": "in",
"values": ["example.com"]
}
]
order_by
object[]

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.

Example:
[
{
"field": "citation_rate",
"direction": "desc"
}
]

Response

200 - application/json

Success

Success

data
object[]
required