Topics
Create and manage topic groups used to organize prompts for the selected project or location.
GETList topics
/projects/{project_id}/visibility/topicsReturns paginated topics in the selected project, ordered deterministically by created_at, then id.
List topics
/projects/{project_id}/visibility/topicsPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
pageinteger1-based page number.
per_pageintegerTopics per page. Maximum: 100.
Response envelope
project_id:uuidtopics:Topic[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
topicsTopic[]Topics ordered by created_at, then id.
paginationPaginationTopic pagination metadata.
Topic
iduuidUnique topic identifier.
namestringCustomer-facing topic name; maximum 200 characters and case-insensitively unique within this visibility scope.
created_atdatetimeTopic creation time in ISO 8601 format.
updated_atdatetimeTime the topic was last updated.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/topics?page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"topics": [
{
"id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"name": "AI visibility platforms",
"created_at": "2026-07-20T08:30:00Z",
"updated_at": "2026-07-20T08:30:00Z"
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
}
}Pagination
pageintegerCurrent 1-based page.
per_pageintegerRecords requested per page.
totalintegerTotal records matching the filters.
total_pagesintegerTotal available pages.
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": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_request | invalid_date_range | range_too_largeA prompt filter, model, identifier, or metrics date range is invalid, or the range exceeds three months.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot manage this visibility scope.
404not_foundThe project, location, or topic was not found.
409conflictThe requested lifecycle operation conflicts with current state.
422validation_failed | prompt_limit_reached | daily_prompt_activation_limit_reachedInput is invalid, a suggested-prompt status is unsupported, capacity is exhausted, or a bulk request exceeds 100 rows.
429rate_limit_exceededToo many requests were made.
POSTCreate topic
/projects/{project_id}/visibility/topicsCreates a topic in the selected project. Topic names should represent a durable customer question area rather than an individual query.
Create topic
/projects/{project_id}/visibility/topicsPath parameters
project_idproject UUID | project external IDProject identifier.
Request body
namestringRequired topic name; maximum 200 characters and case-insensitively unique within the scope.
Response envelope
project_id:uuidtopic:Topicproject_iduuidResolved Ceyo project identifier.
topicTopicCreated topic.
Topic
iduuidUnique topic identifier.
namestringCustomer-facing topic name; maximum 200 characters and case-insensitively unique within this visibility scope.
created_atdatetimeTopic creation time in ISO 8601 format.
updated_atdatetimeTime the topic was last updated.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/topics' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"name":"AI visibility platforms"}'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"topic": {
"id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"name": "AI visibility platforms",
"created_at": "2026-07-20T08:30:00Z",
"updated_at": "2026-07-20T08:30:00Z"
}
}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": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_request | invalid_date_range | range_too_largeA prompt filter, model, identifier, or metrics date range is invalid, or the range exceeds three months.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot manage this visibility scope.
404not_foundThe project, location, or topic was not found.
409conflictThe requested lifecycle operation conflicts with current state.
422validation_failed | prompt_limit_reached | daily_prompt_activation_limit_reachedInput is invalid, a suggested-prompt status is unsupported, capacity is exhausted, or a bulk request exceeds 100 rows.
429rate_limit_exceededToo many requests were made.
GETGet topic
/projects/{project_id}/visibility/topics/{topic_id}Returns one topic from the selected project. Use the prompt list with topic_ids to retrieve its prompts and metrics.
Get topic
/projects/{project_id}/visibility/topics/{topic_id}Path parameters
project_idproject UUID | project external IDProject identifier.
topic_iduuidTopic identifier.
Response envelope
project_id:uuidtopic:Topicproject_iduuidResolved Ceyo project identifier.
topicTopicRequested topic.
Topic
iduuidUnique topic identifier.
namestringCustomer-facing topic name; maximum 200 characters and case-insensitively unique within this visibility scope.
created_atdatetimeTopic creation time in ISO 8601 format.
updated_atdatetimeTime the topic was last updated.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/topics/{topic_id}' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"topic": {
"id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"name": "AI visibility platforms",
"created_at": "2026-07-20T08:30:00Z",
"updated_at": "2026-07-20T08:30:00Z"
}
}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": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_request | invalid_date_range | range_too_largeA prompt filter, model, identifier, or metrics date range is invalid, or the range exceeds three months.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot manage this visibility scope.
404not_foundThe project, location, or topic was not found.
409conflictThe requested lifecycle operation conflicts with current state.
422validation_failed | prompt_limit_reached | daily_prompt_activation_limit_reachedInput is invalid, a suggested-prompt status is unsupported, capacity is exhausted, or a bulk request exceeds 100 rows.
429rate_limit_exceededToo many requests were made.
DELETEDelete topic
/projects/{project_id}/visibility/topics/{topic_id}Starts irreversible asynchronous deletion of a topic and its dependent visibility data. This is not an archive operation.
Delete topic
/projects/{project_id}/visibility/topics/{topic_id}Path parameters
project_idproject UUID | project external IDProject identifier.
topic_iduuidTopic identifier.
Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/topics/{topic_id}' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 202 AcceptedErrorsResponse 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": "validation_failed",
"message": "One or more fields are invalid.",
"details": [
{
"field": "name",
"message": "must be present"
}
],
"request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
}
}Status codes
400invalid_request | invalid_date_range | range_too_largeA prompt filter, model, identifier, or metrics date range is invalid, or the range exceeds three months.
401invalid_api_keyAuthorization is absent or invalid.
403forbiddenThe API key cannot manage this visibility scope.
404not_foundThe project, location, or topic was not found.
409conflictThe requested lifecycle operation conflicts with current state.
422validation_failed | prompt_limit_reached | daily_prompt_activation_limit_reachedInput is invalid, a suggested-prompt status is unsupported, capacity is exhausted, or a bulk request exceeds 100 rows.
429rate_limit_exceededToo many requests were made.