Competitors
Manage tracked and suggested competitors for a project or location, including merges, bulk dismissal, and brand claims.
competitors:read; mutations require competitors:write.GETList competitors
/projects/{project_id}/competitors?state=trackedReturns tracked competitors for the selected project, together with the primary brand and pagination.
List competitors
/projects/{project_id}/competitors?state=trackedPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
statetracked | suggestedReturn competitors in one lifecycle state.
qstringCase-insensitive search across name, domain, and aliases.
domainall | with-domain | without-domainReturn all competitors or filter by whether a domain is present.
sortname-asc | name-desc | newest | visibility | mentionsSort by name, creation time, visibility rate, or mention count.
pageintegerThe 1-based page number.
per_pageintegerNumber of competitors per page. Minimum: 1. Maximum: 50; this matches the maximum suggested dataset size.
List response envelope
project_id:uuidprimary:Competitorcompetitors:Competitor[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
primaryCompetitorPrimary tracked brand for comparison.
competitorsCompetitor[]Competitors matching the filters.
paginationPaginationPagination metadata for competitors.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
Pagination
pageintegerCurrent 1-based page number.
per_pageintegerRequested page size. Minimum: 1. Maximum: 50.
totalintegerTotal competitors matching the applied filters.
total_pagesintegerTotal pages at the current per_page value.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors?state=tracked&sort=visibility&domain=all&page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"primary": {
"id": "10cf756e-ad42-43d7-beda-e8e9cc96cd41",
"kind": "primary",
"name": "Acme",
"domain": "acme.example",
"aliases": ["Acme AI"],
"status": "active",
"competitor_state": null,
"created_at": "2026-04-12T08:00:00Z",
"updated_at": "2026-07-28T10:30:00Z"
},
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Northstar",
"domain": "northstar.example",
"aliases": ["Northstar AI"],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 1,
"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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
422invalid_filter | validation_failedA state, sort, or domain filter is invalid, or a pagination value is outside the supported range.
429rate_limit_exceededToo many requests were made.
POSTCreate competitor
/projects/{project_id}/competitorsCreates a tracked competitor and returns 201 Created. If the normalized domain or case-insensitive name matches an existing dismissed competitor, that record is reactivated and returned with 200 OK instead of creating a duplicate. A tracked competitor requires a domain; aliases accept at most 10 unique values.
Create competitor
/projects/{project_id}/competitorsPath parameters
project_idproject UUID | project external IDProject identifier.
Request body
namestringCompetitor display name. Required.
domainstringCompetitor domain. Required for a tracked competitor and normalized before matching.
aliasesstring[]Optional alternate names. Maximum: 10 unique values.
Create competitor response envelope
project_id:uuidcompetitor:Competitorproject_iduuidResolved Ceyo project identifier.
competitorCompetitorCreated or updated competitor.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
https://www.northstar.example/pricing is stored as northstar.example. A new record returns 201 Created; reactivation by normalized domain or case-insensitive name returns 200 OK.Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"name":"Northstar","domain":"https://www.northstar.example/pricing","aliases":["Northstar AI"]}'HTTP/1.1 201 Created
{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"competitor": {
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Northstar",
"domain": "northstar.example",
"aliases": ["Northstar AI"],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10: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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409domain_conflict | own_domain | invalid_stateThe normalized domain belongs to another active competitor or to the primary brand.
422validation_failed | limit_exceededRequired data is absent, aliases exceed 10, or tracked capacity would be exceeded.
429rate_limit_exceededToo many requests were made.
PATCHUpdate competitor
/projects/{project_id}/competitors/{competitor_id}Updates a competitor's name, normalized domain, aliases, or competitor_state. Omitted fields remain unchanged. Status is derived from competitor_state and cannot be submitted.
Update competitor
/projects/{project_id}/competitors/{competitor_id}Path parameters
project_idproject UUID | project external IDProject identifier.
competitor_iduuidCompetitor identifier.
Request body
namestringMutable display name. Maximum: 200 characters.
domainstringMutable normalized domain. Required whenever competitor_state is tracked.
aliasesstring[]Mutable replacement list of up to 10 unique alternate names.
competitor_statetracked | suggestedMutable lifecycle state. PATCH accepts only tracked or suggested; dismissed is set only by a dismissal or merge operation.
Update competitor response envelope
project_id:uuidcompetitor:Competitorproject_iduuidResolved Ceyo project identifier.
competitorCompetitorCreated or updated competitor.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
name, domain, aliases, and competitor_state. A tracked competitor requires a domain. Status is set internally to active for tracked competitors and inactive for suggested competitors. Setting the state to suggested frees a tracked slot. Dismissed cannot be supplied to PATCH.Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/{competitor_id}' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"name":"Northstar AI","aliases":["Northstar","North Star"],"competitor_state":"suggested"}'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"competitor": {
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Northstar AI",
"domain": "northstar.example",
"aliases": ["Northstar", "North Star"],
"status": "inactive",
"competitor_state": "suggested",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10: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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409domain_conflict | own_domain | invalid_stateThe normalized domain belongs to another active competitor or to the primary brand.
422validation_failed | limit_exceededRequired data is absent, aliases exceed 10, or tracked capacity would be exceeded.
429rate_limit_exceededToo many requests were made.
DELETERemove competitor
/projects/{project_id}/competitors/{competitor_id}Soft-dismisses a competitor while retaining its mentions, rankings, citations, and visibility results.
Remove competitor
/projects/{project_id}/competitors/{competitor_id}Path parameters
project_idproject UUID | project external IDProject identifier.
competitor_iduuidCompetitor identifier.
Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/{competitor_id}' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 204 No ContentErrorsResponse 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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409invalid_stateThe competitor cannot be dismissed from its current state.
429rate_limit_exceededToo many requests were made.
POSTMerge competitors
/projects/{project_id}/competitors/mergeCombines duplicate competitors into one canonical target. Select 2–5 competitors, all in the same lifecycle state.
Merge competitors
/projects/{project_id}/competitors/mergePath parameters
project_idproject UUID | project external IDProject identifier.
Request body
primary_iduuidCanonical competitor to retain.
duplicate_idsuuid[]One to four unique duplicate IDs. Together with primary_id, the selection must contain 2–5 competitors in the same state.
Merge competitors response envelope
project_id:uuidcompetitor:Competitormerged_ids:uuid[]project_iduuidResolved Ceyo project identifier.
competitorCompetitorCreated or updated competitor.
merged_idsuuid[]Records now pointing to the canonical competitor.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/merge' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"primary_id":"63ec8dad-c12f-43c8-89e4-06eb629d0977","duplicate_ids":["d732c038-d411-449c-a6cb-351b6d8a2961"]}'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"competitor": {
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Northstar",
"domain": "northstar.example",
"aliases": ["Northstar AI"],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
},
"merged_ids": ["d732c038-d411-449c-a6cb-351b6d8a2961"]
}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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409mixed_states | invalid_targetThe selected competitors do not share a state or the primary competitor is invalid.
422invalid_selectionSelect between 2 and 5 unique competitor IDs.
422validation_failedThe merged aliases exceed the supported limit.
429rate_limit_exceededToo many requests were made.
POSTBulk remove competitors
/projects/{project_id}/competitors/bulk_destroySoft-dismisses up to 25 competitors in one request, retains their stored results, and returns the dismissed IDs with 200 OK.
Bulk remove competitors
/projects/{project_id}/competitors/bulk_destroyPath parameters
project_idproject UUID | project external IDProject identifier.
Request body
idsuuid[]One to 25 unique competitor IDs to dismiss.
Bulk remove competitors response envelope
project_id:uuiddismissed_ids:uuid[]project_iduuidResolved Ceyo project identifier.
dismissed_idsuuid[]Competitor IDs dismissed by this request.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/bulk_destroy' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"ids":["63ec8dad-c12f-43c8-89e4-06eb629d0977","d732c038-d411-449c-a6cb-351b6d8a2961"]}'HTTP/1.1 200 OK
{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"dismissed_ids": ["63ec8dad-c12f-43c8-89e4-06eb629d0977", "d732c038-d411-449c-a6cb-351b6d8a2961"]
}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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
422invalid_selectionSupply between 1 and 25 unique competitor IDs.
429rate_limit_exceededToo many requests were made.
POSTClaim competitor as brand
/projects/{project_id}/competitors/{competitor_id}/claim_as_brandPromotes a competitor identity to the primary brand. Its name and aliases are added to the brand aliases, then the competitor is soft-dismissed.
Claim competitor as brand
/projects/{project_id}/competitors/{competitor_id}/claim_as_brandPath parameters
project_idproject UUID | project external IDProject identifier.
competitor_iduuidCompetitor identifier.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/{competitor_id}/claim_as_brand' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 204 No ContentErrorsResponse 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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409invalid_stateThe competitor cannot be claimed from its current state.
422alias_limit_exceededClaiming the competitor would exceed the maximum of 10 brand aliases.
429rate_limit_exceededToo many requests were made.
GETList suggested competitors
/projects/{project_id}/competitors?state=suggestedReturns the current suggested competitor dataset for the selected project, capped at 50 items. Suggested items may include visibility-rate and average-rank metrics.
List suggested competitors
/projects/{project_id}/competitors?state=suggestedPath parameters
project_idproject UUID | project external IDProject identifier.
Query parameters
statetracked | suggestedReturn competitors in one lifecycle state.
qstringCase-insensitive search across name, domain, and aliases.
domainall | with-domain | without-domainReturn all competitors or filter by whether a domain is present.
sortname-asc | name-desc | newest | visibility | mentionsSort by name, creation time, visibility rate, or mention count.
pageintegerThe 1-based page number.
per_pageintegerNumber of competitors per page. Minimum: 1. Maximum: 50; this matches the maximum suggested dataset size.
List response envelope
project_id:uuidprimary:Competitorcompetitors:Competitor[]pagination:Paginationproject_iduuidResolved Ceyo project identifier.
primaryCompetitorPrimary tracked brand for comparison.
competitorsCompetitor[]Competitors matching the filters.
paginationPaginationPagination metadata for competitors.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
metricsCompetitorMetrics (optional)Included only on suggested-list items with qualifying responses; otherwise omitted.
Pagination
pageintegerCurrent 1-based page number.
per_pageintegerRequested page size. Minimum: 1. Maximum: 50.
totalintegerTotal competitors matching the applied filters.
total_pagesintegerTotal pages at the current per_page value.
CompetitorMetrics
visibility_ratenumberPercentage of eligible responses that mentioned this entity, from 0 through 100.
avg_ranknumber | nullAverage 1-based rank when a ranked result included the entity.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors?state=suggested&sort=visibility&domain=all&page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"primary": {
"id": "10cf756e-ad42-43d7-beda-e8e9cc96cd41",
"kind": "primary",
"name": "Acme",
"domain": "acme.example",
"aliases": ["Acme AI"],
"status": "active",
"competitor_state": null,
"created_at": "2026-04-12T08:00:00Z",
"updated_at": "2026-07-28T10:30:00Z"
},
"competitors": [
{
"id": "a8223436-70dc-4bc8-89fc-99139366711c",
"kind": "competitor",
"name": "Orbit Labs",
"domain": "orbitlabs.example",
"aliases": [],
"status": "inactive",
"competitor_state": "suggested",
"created_at": "2026-07-21T07:15:00Z",
"updated_at": "2026-07-30T09:10:00Z",
"metrics": {
"visibility_rate": 24.17,
"avg_rank": 4.2
}
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 1,
"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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
422invalid_filter | validation_failedA state, sort, or domain filter is invalid, or a pagination value is outside the supported range.
429rate_limit_exceededToo many requests were made.
PATCHTrack suggested competitor
/projects/{project_id}/competitors/{competitor_id}Moves a suggested competitor into the tracked set. The suggestion must have a valid normalized domain and a tracked slot must be available.
Track suggested competitor
/projects/{project_id}/competitors/{competitor_id}Path parameters
project_idproject UUID | project external IDProject identifier.
competitor_iduuidCompetitor identifier.
Request body
namestringMutable display name. Maximum: 200 characters.
domainstringMutable normalized domain. Required whenever competitor_state is tracked.
aliasesstring[]Mutable replacement list of up to 10 unique alternate names.
competitor_statetracked | suggestedMutable lifecycle state. PATCH accepts only tracked or suggested; dismissed is set only by a dismissal or merge operation.
competitor_state to tracked. Status is set to active internally. Any other mutable fields may be updated in the same request.Track suggested competitor response envelope
project_id:uuidcompetitor:Competitorproject_iduuidResolved Ceyo project identifier.
competitorCompetitorCreated or updated competitor.
Competitor
iduuidUnique competitor identifier.
kindprimary | competitorEntity role. Items in competitors are competitor; primary describes the tracked brand.
namestringDisplay name used in prompts, results, and reports.
domainstring | nullNormalized hostname without a scheme, path, query, leading www, or trailing dot.
aliasesstring[]Additional names recognized as this entity. Maximum: 10.
statusactive | inactiveProcessing status. Competitors are active exactly when tracked and inactive when suggested or dismissed.
competitor_statetracked | suggested | dismissed | nullCompetitor management lifecycle state. Null for the primary brand.
created_atdatetimeCompetitor creation time.
updated_atdatetimeLast competitor update time.
Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/{competitor_id}' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{"competitor_state":"tracked"}'{
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"competitor": {
"id": "a8223436-70dc-4bc8-89fc-99139366711c",
"kind": "competitor",
"name": "Orbit Labs",
"domain": "orbitlabs.example",
"aliases": [],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-21T07:15:00Z",
"updated_at": "2026-07-30T09:10: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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409domain_conflict | own_domain | invalid_stateThe normalized domain belongs to another active competitor or to the primary brand.
422validation_failed | limit_exceededRequired data is absent, aliases exceed 10, or tracked capacity would be exceeded.
429rate_limit_exceededToo many requests were made.
DELETEDismiss suggested competitor
/projects/{project_id}/competitors/{competitor_id}Soft-dismisses a suggested competitor so it is excluded from the active suggestion queue while retaining its discovery evidence.
Dismiss suggested competitor
/projects/{project_id}/competitors/{competitor_id}Path parameters
project_idproject UUID | project external IDProject identifier.
competitor_iduuidCompetitor identifier.
Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/competitors/{competitor_id}' \
--header 'Authorization: Bearer ceyo_platform_...'HTTP/1.1 204 No ContentErrorsResponse 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": "domain", "message": "must be a valid hostname" }],
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyAuthorization bearer token is absent or invalid.
403forbiddenThe API key lacks the required competitor capability or cannot access this scope.
404not_foundProject, location, or competitor was not found.
409invalid_stateThe competitor cannot be dismissed from its current state.
429rate_limit_exceededToo many requests were made.