Suggested prompts
Review, track, or dismiss prompt suggestions generated from visibility evidence.
GETList suggested prompts
/projects/{project_id}/visibility/suggested_promptsReturns paginated diagnosis- and fanout-sourced prompt suggestions for the selected project. Suggestions are separate from tracked prompts and consume no capacity.
List suggested prompts
/projects/{project_id}/visibility/suggested_promptsPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
qstringSearch suggestion content, reason, and topic name.
statussuggested | tracked | dismissed | expiredSuggestion lifecycle state to return.
pageinteger1-based page number.
per_pageintegerSuggestions per page. Maximum: 100.
Response envelope
project_id:uuidsuggested_prompts:SuggestedPrompt[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
suggested_promptsSuggestedPrompt[]Suggestions matching the selected status and search.
paginationPaginationSuggestion pagination metadata.
SuggestedPrompt
iduuidSuggested prompt identifier.
topic_iduuidExisting topic selected for the suggestion.
topic_namestringCurrent name of the selected topic.
contentstringSuggested prompt question.
categorygeneral | organic_search | brand_sentiment | competitor_comparisonPrompt intent category.
reasonstring | nullEvidence-based reason the prompt was suggested.
statussuggested | tracked | dismissed | expiredSuggestion lifecycle state.
tracked_prompt_iduuid | nullPrompt created when this suggestion was tracked.
created_atdatetimeSuggestion creation time.
tracked_atdatetime | nullTime the suggestion became a tracked prompt.
dismissed_atdatetime | nullTime the suggestion was dismissed.
expired_atdatetime | nullTime the suggestion was automatically expired.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerRecords requested per page.
totalintegerTotal records matching the filters.
total_pagesintegerTotal available pages.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/suggested_prompts?status=suggested&page=1&per_page=20' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"suggested_prompts": [
{
"id": "5c297c06-6609-4e2f-ab59-3297e10be39f",
"topic_id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"topic_name": "AI visibility platforms",
"content": "What are the best ways to improve brand visibility in AI answers?",
"category": "general",
"reason": "Diagnosis found low visibility for non-branded discovery questions.",
"status": "suggested",
"tracked_prompt_id": null,
"created_at": "2026-07-31T08:00:00Z",
"tracked_at": null,
"dismissed_at": null,
"expired_at": null
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 5,
"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": "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 suggested prompt 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.
POSTTrack suggested prompt
/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/trackConverts one visible suggestion into an active prompt and schedules a visibility run. The operation consumes active and daily activation capacity.
Track suggested prompt
/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/trackPath parameters
project_idproject UUID | project external IDProject identifier.
suggested_prompt_iduuidSuggested Prompt identifier.
SuggestedPrompt
iduuidSuggested prompt identifier.
topic_iduuidExisting topic selected for the suggestion.
topic_namestringCurrent name of the selected topic.
contentstringSuggested prompt question.
categorygeneral | organic_search | brand_sentiment | competitor_comparisonPrompt intent category.
reasonstring | nullEvidence-based reason the prompt was suggested.
statussuggested | tracked | dismissed | expiredSuggestion lifecycle state.
tracked_prompt_iduuid | nullPrompt created when this suggestion was tracked.
created_atdatetimeSuggestion creation time.
tracked_atdatetime | nullTime the suggestion became a tracked prompt.
dismissed_atdatetime | nullTime the suggestion was dismissed.
expired_atdatetime | nullTime the suggestion was automatically expired.
Response envelope
project_id:uuidsuggested_prompts:SuggestedPrompt[]prompts:Prompt[]project_iduuidResolved Ceyo project identifier.
suggested_promptsSuggestedPrompt[]Suggestions transitioned to tracked.
promptsPrompt[]Prompts created from the suggestions.
Prompt
iduuidUnique prompt identifier.
topic_iduuidTopic that contains the prompt.
topic_namestringCurrent name of the containing topic.
contentstringQuestion sent to configured AI models. Maximum 20,000 characters.
categorygeneral | organic_search | brand_sentiment | competitor_comparisonStable snake_case intent category.
city_overridestring | nullPrompt-specific city. Null means the city is inherited from the selected scope.
country_overridestring | nullPrompt-specific country. Null means the country is inherited from the selected scope; present together with country_code_override.
country_code_overridestring | nullPrompt-specific uppercase ISO 3166-1 alpha-2 country code. Null means the code is inherited; present together with country_override.
archived_atdatetime | nullArchive time. Null means the prompt is active.
created_atdatetimePrompt creation time in ISO 8601 format.
metricsPromptMetrics | nullVisibility metrics for the requested date and model filters.
PromptMetrics
primary_mentionsintegerResponses that mentioned the primary tracked brand.
visibility_percentagenumberShare of responses that mentioned the primary tracked brand.
visibility_trend_ppnumber | nullPercentage-point change from the preceding equal-length period.
average_positionnumber | nullAverage 1-based primary-brand position when mentioned.
position_trendnumber | nullAverage-position change from the preceding period.
average_position_trendnumber | nullChange in average position from the preceding comparison window.
average_sentimentnumber | nullAverage primary-brand sentiment score.
sentiment_countsSentimentCountsResponse counts keyed by negative, neutral, and positive.
citationsintegerCitation occurrences across matching responses.
competitor_mentionsRecord<string, integer>Mention counts keyed by tracked competitor name.
SentimentCounts
negativeintegerNegative responses.
neutralintegerNeutral responses.
positiveintegerPositive responses.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/track' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"suggested_prompts": [
{
"id": "5c297c06-6609-4e2f-ab59-3297e10be39f",
"topic_id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"topic_name": "AI visibility platforms",
"content": "What are the best ways to improve brand visibility in AI answers?",
"category": "general",
"reason": "Diagnosis found low visibility for non-branded discovery questions.",
"status": "tracked",
"tracked_prompt_id": "4de5e484-ce6a-4e45-ad7c-bd48db2549af",
"created_at": "2026-07-31T08:00:00Z",
"tracked_at": "2026-07-31T10:10:00Z",
"dismissed_at": null,
"expired_at": null
}
],
"prompts": [
{
"id": "4de5e484-ce6a-4e45-ad7c-bd48db2549af",
"topic_id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"topic_name": "AI visibility platforms",
"content": "Which platforms help brands measure visibility in AI answers?",
"category": "organic_search",
"city_override": null,
"country_override": null,
"country_code_override": null,
"archived_at": null,
"created_at": "2026-07-20T08:35:00Z",
"metrics": null
}
]
}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 suggested prompt 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.
POSTDismiss suggested prompt
/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/dismissDismisses one visible suggestion without creating a prompt. Dismissed content remains fingerprinted to prevent the same suggestion from reappearing.
Dismiss suggested prompt
/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/dismissPath parameters
project_idproject UUID | project external IDProject identifier.
suggested_prompt_iduuidSuggested Prompt identifier.
SuggestedPrompt
iduuidSuggested prompt identifier.
topic_iduuidExisting topic selected for the suggestion.
topic_namestringCurrent name of the selected topic.
contentstringSuggested prompt question.
categorygeneral | organic_search | brand_sentiment | competitor_comparisonPrompt intent category.
reasonstring | nullEvidence-based reason the prompt was suggested.
statussuggested | tracked | dismissed | expiredSuggestion lifecycle state.
tracked_prompt_iduuid | nullPrompt created when this suggestion was tracked.
created_atdatetimeSuggestion creation time.
tracked_atdatetime | nullTime the suggestion became a tracked prompt.
dismissed_atdatetime | nullTime the suggestion was dismissed.
expired_atdatetime | nullTime the suggestion was automatically expired.
Response envelope
project_id:uuidsuggested_prompts:SuggestedPrompt[]project_iduuidResolved Ceyo project identifier.
suggested_promptsSuggestedPrompt[]Suggestions transitioned to dismissed.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/suggested_prompts/{suggested_prompt_id}/dismiss' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"suggested_prompts": [
{
"id": "5c297c06-6609-4e2f-ab59-3297e10be39f",
"topic_id": "ab20526b-6bb2-436c-8c93-5bf77ea43848",
"topic_name": "AI visibility platforms",
"content": "What are the best ways to improve brand visibility in AI answers?",
"category": "general",
"reason": "Diagnosis found low visibility for non-branded discovery questions.",
"status": "dismissed",
"tracked_prompt_id": null,
"created_at": "2026-07-31T08:00:00Z",
"tracked_at": null,
"dismissed_at": "2026-07-31T10:12:00Z",
"expired_at": null
}
]
}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 suggested prompt 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.