Signal API
Visibility analytics as MarkdownUse a clean Markdown version of this page with an agent or local tooling.

Visibility

Measure brand visibility, compare competitors, and track performance trends across AI models for a project or location.

Choose Project or Location above to set the analytics scope. Date ranges default to seven days and can span up to three months. Path identifiers accept either Ceyo UUIDs or partner external IDs.
Percentage metricsVisibility, coverage, and share of voice are percentages from 0 to 100. Competitor timeseries are keyed by tracked entity, with selected model keys returned separately in models.
GET
/projects/{project_id}/visibility/summary

Returns aggregate visibility and citation metrics for matching responses in the selected project.

Parameters

Path parameters

project_idproject UUID | project external ID

Project identifier.

Required
Parameters

Query parameters

startdate

First run date to include, in YYYY-MM-DD format.

OptionalDefault: 6 days before end
enddate

Last run date to include, in YYYY-MM-DD format.

OptionalDefault: Today
modelsstring

Comma-separated or repeated model keys, such as chatgpt,claude,perplexity.

OptionalDefault: All model keys present in matching responses
topic_idsstring

Comma-separated or repeated topic UUIDs.

Optional
topic_iduuid

Alias for topic_ids when filtering by one topic UUID.

Optional
prompt_iduuid

Restrict results to one prompt in the selected scope.

Optional
Response

Response envelope

start:dateend:datemodels:string[]summary:object
startdate

Resolved start date.

enddate

Resolved end date.

modelsstring[]

Model keys included in the calculation. When omitted from the request, this contains every model key present in matching responses.

summaryobject

Aggregate visibility metrics.

Object

Summary object

primary_mentionsinteger

Responses in which the primary tracked entity was mentioned.

visibility_percentagenumber

Share of responses that mentioned the primary tracked entity, rounded to two decimals.

average_positionnumber | null

Average 1-based position for primary-entity mentions with a detected position.

citationsinteger

Total citation occurrences across matching responses.

Metric definitionsvisibility_percentage is the share of matching responses that mention the primary entity. average_position uses only primary mentions with a detected position, and citations counts citation occurrences.

Request and response

Example requestcURL
curl --request GET \
  --url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/summary?start=2026-07-24&end=2026-07-30&models=chatgpt,perplexity' \
  --header 'Authorization: Bearer ceyo_platform_...'
Example responseJSON
{
  "start": "2026-07-24",
  "end": "2026-07-30",
  "models": ["chatgpt", "perplexity"],
  "summary": {
    "primary_mentions": 17,
    "visibility_percentage": 42.5,
    "average_position": 2.82,
    "citations": 31
  }
}
ErrorsResponse format and status codes
Errors

Error response envelope

errorError

Structured error payload.

Errors

Error

codestring

Stable snake_case code suitable for programmatic handling.

messagestring

Human-readable explanation of the failure.

detailsobject | array | null

Structured validation or request context when available.

request_idstring

Identifier to provide when requesting support.

Example error responseJSON
{
  "error": {
    "code": "validation_failed",
    "message": "One or more fields are invalid.",
    "details": [
      {
        "field": "name",
        "message": "must be present"
      }
    ],
    "request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
  }
}
Errors

Status codes

400invalid_date_range | range_too_large

A date is invalid or the requested window exceeds three months.

401invalid_api_key

The Bearer API key is missing or invalid.

403forbidden

The API key is valid but is not allowed to access this resource.

404not_found

The project, location, or visibility scope was not found.

422visibility_unavailable

Project-level visibility is unavailable for a locations-only container; use a location scope.

429rate_limit_exceeded

Too many requests were made.

GET
/projects/{project_id}/visibility/competitors

Compares the primary entity plus tracked competitors for the selected project, ordered with primary first, then by share_of_voice descending and name.

Parameters

Path parameters

project_idproject UUID | project external ID

Project identifier.

Required
Parameters

Query parameters

startdate

First run date to include, in YYYY-MM-DD format.

OptionalDefault: 6 days before end
enddate

Last run date to include, in YYYY-MM-DD format.

OptionalDefault: Today
modelsstring

Comma-separated or repeated model keys, such as chatgpt,claude,perplexity.

OptionalDefault: All model keys present in matching responses
topic_idsstring

Comma-separated or repeated topic UUIDs.

Optional
topic_iduuid

Alias for topic_ids when filtering by one topic UUID.

Optional
prompt_iduuid

Restrict results to one prompt in the selected scope.

Optional
Response

Response envelope

start:dateend:datemodels:string[]total_mentions:integerentities:object[]
startdate

Resolved start date.

enddate

Resolved end date.

modelsstring[]

Model keys included in the calculation. When omitted from the request, this contains every model key present in matching responses.

total_mentionsinteger

Mentions across all returned entities.

entitiesobject[]

The primary entity plus tracked competitors, ordered with primary first, then by share_of_voice descending and name.

Object

Entity

tracked_entity_iduuid

Tracked primary brand or competitor identifier.

kindprimary | competitor

Entity relationship to the selected scope.

namestring

Tracked entity name.

domainstring | null

Normalized entity domain when configured.

statusactive

Current tracked-entity status. Only active entities are returned.

mentionsinteger

Responses in which this entity was mentioned.

coverage_percentagenumber

Share of matching responses that mentioned the entity.

share_of_voicenumber

Entity mentions divided by mentions across all returned entities, multiplied by 100.

average_positionnumber | null

Average detected 1-based position when the entity was mentioned.

Metric definitionsCoverage uses all matching responses as its denominator. Share of voice uses mentions across the returned primary entity and tracked competitors. Results place the primary entity first, followed by competitors ordered by share_of_voice descending and then name. When there are no mentions, both percentages are 0.0 and average position is null.

Request and response

Example requestcURL
curl --request GET \
  --url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/visibility/competitors?start=2026-07-24&end=2026-07-30&topic_ids=ab20526b-6bb2-436c-8c93-5bf77ea43848' \
  --header 'Authorization: Bearer ceyo_platform_...'
Example responseJSON
{
  "start": "2026-07-24",
  "end": "2026-07-30",
  "models": ["chatgpt", "perplexity"],
  "total_mentions": 33,
  "entities": [
    {
      "tracked_entity_id": "f3385d92-8f24-49f2-9819-18412e93427f",
      "kind": "primary",
      "name": "Ceyo",
      "domain": "ceyo.ai",
      "status": "active",
      "mentions": 17,
      "coverage_percentage": 42.5,
      "share_of_voice": 51.52,
      "average_position": 2.82
    },
    {
      "tracked_entity_id": "2e230599-4918-49a7-bb08-b30711836aa8",
      "kind": "competitor",
      "name": "Example Competitor",
      "domain": "competitor.example",
      "status": "active",
      "mentions": 16,
      "coverage_percentage": 40.0,
      "share_of_voice": 48.48,
      "average_position": 3.13
    }
  ]
}
ErrorsResponse format and status codes
Errors

Error response envelope

errorError

Structured error payload.

Errors

Error

codestring

Stable snake_case code suitable for programmatic handling.

messagestring

Human-readable explanation of the failure.

detailsobject | array | null

Structured validation or request context when available.

request_idstring

Identifier to provide when requesting support.

Example error responseJSON
{
  "error": {
    "code": "validation_failed",
    "message": "One or more fields are invalid.",
    "details": [
      {
        "field": "name",
        "message": "must be present"
      }
    ],
    "request_id": "req_01K1GP6J8QQFZ4D2B6C5A9V3TS"
  }
}
Errors

Status codes

400invalid_date_range | range_too_large

A date is invalid or the requested window exceeds three months.

401invalid_api_key

The Bearer API key is missing or invalid.

403forbidden

The API key is valid but is not allowed to access this resource.

404not_found

The project, location, or visibility scope was not found.

422visibility_unavailable

Project-level visibility is unavailable for a locations-only container; use a location scope.

429rate_limit_exceeded

Too many requests were made.