Citations
Fetch successful model responses and the sources cited across a project or location.
visibility:read capability.GETList prompt citations
/projects/{project_id}/prompts/{prompt_id}/citationsAggregates every citation attached to responses for one prompt in the selected project. Repeated citations are combined and counted across the requested date range.
List prompt citations
/projects/{project_id}/prompts/{prompt_id}/citationsPath parameters
project_idproject UUID | project external IDProject identifier.
prompt_iduuidPrompt identifier.
Query parameters
startdateFirst run date to include, in YYYY-MM-DD format.
enddateLast run date to include, in YYYY-MM-DD format.
modelsstringComma-separated or repeated model keys. For example: chatgpt,claude,perplexity.
pageintegerThe 1-based page number.
per_pageintegerNumber of records per page. Maximum: 50.
Response envelope
project_id:uuidprompt_id:uuidstart:dateend:datemodels:string[]rows:Citation[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
prompt_iduuidPrompt represented by the response.
startdateResolved start date.
enddateResolved end date.
modelsstring[]Model keys included in the response.
rowsCitation[]Paginated citation pages.
paginationPaginationPagination metadata.
Citation
domainstringNormalized citation hostname.
pagestringNormalized page value used for grouping and display.
urlstringCanonical citation URL.
titlestring | nullStored page title when supplied by the response provider.
frequencyintegerCitation occurrences across the selected responses.
model_keysstring[]Models that cited the page at least once.
model_frequenciesRecord<string, integer>Citation frequency keyed by model.
Pagination
pageintegerCurrent 1-based page number.
per_pageintegerRequested number of records per page.
totalintegerTotal records matching the request.
total_pagesintegerTotal available pages.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/prompts/{prompt_id}/citations?start=2026-07-24&end=2026-07-30&models=chatgpt,perplexity' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"prompt_id": "4de5e484-ce6a-4e45-ad7c-bd48db2549af",
"start": "2026-07-24",
"end": "2026-07-30",
"models": ["chatgpt", "perplexity"],
"rows": [
{
"domain": "example.com",
"page": "example.com/ai-visibility",
"url": "https://example.com/ai-visibility",
"title": "A guide to AI visibility",
"frequency": 6,
"model_keys": ["chatgpt", "perplexity"],
"model_frequencies": {
"chatgpt": 4,
"perplexity": 2
}
}
],
"pagination": {
"page": 1,
"per_page": 15,
"total": 8,
"total_pages": 1
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_date_range",
"message": "The requested date range is invalid.",
"details": null,
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_date_range | range_too_large | invalid_filterThe requested filters or date range are invalid.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot access this resource.
404not_foundThe project, location, or prompt was not found.
422visibility_unavailableVisibility is unavailable for the selected scope.
429rate_limit_exceededToo many requests were made.
GETList project citations
/projects/{project_id}/citationsReturns citation frequency across every matching prompt response in the selected project. Results can be grouped by individual page or by domain.
List project citations
/projects/{project_id}/citationsPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
startdateFirst run date to include, in YYYY-MM-DD format.
enddateLast run date to include, in YYYY-MM-DD format.
modelsstringComma-separated or repeated model keys. For example: chatgpt,claude,perplexity.
topic_idsstringComma-separated topic UUIDs.
grouppage | domainReturn page rows or domain groups containing their top pages.
qstringSearch citation domains, URLs, and titles.
domainstringRestrict results to one normalized domain.
exclude_competitorsbooleanExclude tracked competitor domains and subdomains.
pageintegerThe 1-based page number.
per_pageintegerNumber of records per page. Maximum: 100.
Response envelope
project_id:uuidstart:dateend:datemodels:string[]group:page | domainrows:Citation[]groups:CitationDomainGroup[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
startdateResolved start date.
enddateResolved end date.
modelsstring[]Model keys included in the response.
grouppage | domainResolved grouping mode.
rowsCitation[]Page citations when group is page; otherwise empty.
groupsCitationDomainGroup[]Domain groups when group is domain; otherwise empty.
paginationPaginationPagination metadata for the selected grouping.
Citation
domainstringNormalized citation hostname.
pagestringNormalized page value used for grouping and display.
urlstringCanonical citation URL.
titlestring | nullStored page title when supplied by the response provider.
frequencyintegerCitation occurrences across the selected responses.
model_keysstring[]Models that cited the page at least once.
model_frequenciesRecord<string, integer>Citation frequency keyed by model.
CitationDomainGroup
domainstringNormalized citation hostname.
frequencyintegerCitation occurrences across every page in the domain.
model_keysstring[]Models that cited the domain.
model_frequenciesRecord<string, integer>Domain citation frequency keyed by model.
pagesCitation[]Highest-frequency pages within the domain.
Pagination
pageintegerCurrent 1-based page number.
per_pageintegerRequested number of records per page.
totalintegerTotal records matching the request.
total_pagesintegerTotal available pages.
group=page, results are returned in rows. When group=domain, rows is empty and domain results are returned in groups.Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/citations?start=2026-07-01&end=2026-07-30&group=domain' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"start": "2026-07-01",
"end": "2026-07-30",
"models": ["chatgpt", "perplexity"],
"group": "domain",
"rows": [],
"groups": [
{
"domain": "example.com",
"frequency": 19,
"model_keys": ["chatgpt", "perplexity"],
"model_frequencies": {
"chatgpt": 12,
"perplexity": 7
},
"pages": [
{
"domain": "example.com",
"page": "example.com/ai-visibility",
"url": "https://example.com/ai-visibility",
"title": "A guide to AI visibility",
"frequency": 11,
"model_keys": ["chatgpt", "perplexity"],
"model_frequencies": {
"chatgpt": 7,
"perplexity": 4
}
}
]
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 12,
"total_pages": 1
}
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_date_range",
"message": "The requested date range is invalid.",
"details": null,
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_date_range | range_too_large | invalid_filterThe requested filters or date range are invalid.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot access this resource.
404not_foundThe project, location, or prompt was not found.
422visibility_unavailableVisibility is unavailable for the selected scope.
429rate_limit_exceededToo many requests were made.
GETGet citation trends
/projects/{project_id}/citations/timeseriesReturns daily citation totals for the selected project, including a count for each requested model. Dates with no citations are returned with zero values.
Get citation trends
/projects/{project_id}/citations/timeseriesPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
startdateFirst run date to include, in YYYY-MM-DD format.
enddateLast run date to include, in YYYY-MM-DD format.
modelsstringComma-separated or repeated model keys. For example: chatgpt,claude,perplexity.
topic_idsstringComma-separated topic UUIDs.
exclude_competitorsbooleanExclude tracked competitor domains and subdomains.
groupdomain | pageControl whether top citations represent domains or pages.
Response envelope
project_id:uuidstart:dateend:datemodels:string[]points:CitationTimeseriesPoint[]project_iduuidResolved Ceyo project identifier.
startdateResolved start date.
enddateResolved end date.
modelsstring[]Model keys included in the response.
pointsCitationTimeseriesPoint[]One zero-filled point for each date in the range.
CitationTimeseriesPoint
datedateCalendar date represented by the point.
totalsRecord<string, integer>Citation count keyed by model.
totalintegerTotal citations across the selected models.
top_citationsTopCitation[]Up to five highest-frequency domains or pages.
TopCitation
domainstringNormalized citation hostname.
urlstring | nullCitation URL when grouping by page.
titlestring | nullStored page title when grouping by page.
frequencyintegerCitation occurrences for this date.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/citations/timeseries?start=2026-07-24&end=2026-07-30&models=chatgpt,perplexity' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"start": "2026-07-24",
"end": "2026-07-30",
"models": ["chatgpt", "perplexity"],
"points": [
{
"date": "2026-07-30",
"totals": {
"chatgpt": 12,
"perplexity": 8
},
"total": 20,
"top_citations": [
{
"domain": "example.com",
"url": "https://example.com/ai-visibility",
"title": "A guide to AI visibility",
"frequency": 7
}
]
}
]
}ErrorsResponse format and status codes
Error response envelope
errorErrorStructured error payload.
Error
codestringStable snake_case code suitable for programmatic handling.
messagestringHuman-readable explanation of the failure.
detailsobject | array | nullStructured validation or request context when available.
request_idstringIdentifier to provide when requesting support.
{
"error": {
"code": "invalid_date_range",
"message": "The requested date range is invalid.",
"details": null,
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_date_range | range_too_large | invalid_filterThe requested filters or date range are invalid.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot access this resource.
404not_foundThe project, location, or prompt was not found.
422visibility_unavailableVisibility is unavailable for the selected scope.
429rate_limit_exceededToo many requests were made.