Skip to main content
POST
/
v2
/
reports
/
citations
curl -X POST https://api.tryprofound.com/v2/reports/citations \
  -H "X-API-Key: <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "category_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "start_date": "2026-06-09",
    "end_date": "2026-06-15"
  }'
{
  "info": {
    "total_results": 11662,
    "count": 10,
    "next_cursor": "Z0FBQUFBQnFQcWdrbDRiSHpGaktVNm5N...",
    "scope": "all",
    "models": ["ChatGPT", "Google Gemini", "Perplexity", "Claude", "..."],
    "metrics": ["count", "citation_share", "rank"],
    "analysis_types": ["visibility"],
    "start_date": "2026-06-09",
    "end_date": "2026-06-15",
    "filter": null
  },
  "data": [
    { "domain": "reddit.com", "rank": 1, "count": 13940, "citation_share": 0.040 },
    { "domain": "youtube.com", "rank": 2, "count": 16287, "citation_share": 0.037 },
    { "domain": "tryprofound.com", "rank": 3, "count": 10414, "citation_share": 0.029 }
    // ...7 more rows in this page (count: 10, total_results: 11662); paginate with next_cursor
  ]
}
Which domains and pages AI answers cite, ranked most-cited first. Group by page for URL-level rows; use scope: "owned" to see only domains you own.
  • Metrics: count (raw citations), citation_share (per-model average share), rank, first_cited_at (pages only).
  • group_by: page, date, model, topic, region, persona, prompt.
  • No sort: rows are always ranked most-cited first.
  • Citation-layer filters: domain (subdomain-aware), page, analysis_type (visibility·sentiment·factcheck·all), citation_category (owned·competition·social·earned_media·earned_institutions·pr_wire·other·custom).
count and citation_share measure different things: citation_share is averaged per AI model, so it won’t sort in lockstep with raw count.
New to the v2 reports? See Filtering & concepts for the shared request shape, filter tree, grouping, and pagination.
POST /v2/reports/citations/stream takes the same request body and returns Server-Sent Events: one summary event (the info block), then one result event per row. limit/cursor are ignored; it returns everything by default. Pass max_results to cap.
Response (text/event-stream)
event: summary
data: { ...the info block... }

event: result    ← one per row, same shape as data[] above
data: {"domain": "reddit.com", "rank": 1, "count": 13940, "citation_share": 0.040}
curl -X POST https://api.tryprofound.com/v2/reports/citations \
  -H "X-API-Key: <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "category_id": "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e",
    "start_date": "2026-06-09",
    "end_date": "2026-06-15"
  }'
{
  "info": {
    "total_results": 11662,
    "count": 10,
    "next_cursor": "Z0FBQUFBQnFQcWdrbDRiSHpGaktVNm5N...",
    "scope": "all",
    "models": ["ChatGPT", "Google Gemini", "Perplexity", "Claude", "..."],
    "metrics": ["count", "citation_share", "rank"],
    "analysis_types": ["visibility"],
    "start_date": "2026-06-09",
    "end_date": "2026-06-15",
    "filter": null
  },
  "data": [
    { "domain": "reddit.com", "rank": 1, "count": 13940, "citation_share": 0.040 },
    { "domain": "youtube.com", "rank": 2, "count": 16287, "citation_share": 0.037 },
    { "domain": "tryprofound.com", "rank": 3, "count": 10414, "citation_share": 0.029 }
    // ...7 more rows in this page (count: 10, total_results: 11662); paginate with next_cursor
  ]
}

Authorizations

X-API-Key
string
header
required

Body

application/json
category_id
string
required
start_date
string
required

YYYY-MM-DD, ET, inclusive

end_date
string
required

YYYY-MM-DD, ET, inclusive

group_by
enum<string>[]
Available options:
page,
date,
model,
topic,
region,
persona,
prompt
metrics
enum<string>[] | null
Available options:
count,
citation_share,
rank,
first_cited_at
interval
enum<string>
default:day
Available options:
day,
week,
month
scope
enum<string>
default:all

all (every cited domain) or owned (only your owned domains, for easy client-side totals).

Available options:
all,
owned
filter
FilterNode · object

A leaf (field/op/value) or an and/or/not group.

limit
integer | null

Page size; default 10, max 50.

Required range: 0 < x <= 50
max_results
integer | null

Stream endpoint only: cap the number of streamed rows (default: all).

Required range: x > 0
cursor
string | null

Response

Successful Response

The response is of type Response Query Citations V2 V2 Reports Citations Post · object.