Projects
Provision and manage projects in the workspace selected by your API key.
201. Set start: true on a standard project or location to start onboarding immediately after provisioning. Location container projects require start: false.Authorization: Bearer ceyo_platform_... on every request. The API key selects the workspace, so paths never require a workspace identifier.package_id. Every location selects an active location package. A locations_only project is a container for locations, has no project package, and is not itself a tracking scope. Package assignments cannot be changed through resource updates.page and per_page, return pagination metadata, and return an empty array when the page is beyond the result set. Filters combine with AND. Search is trimmed, case-insensitive, and limited to 200 characters. Sorts are stable and use resource ID as the final ascending tie-breaker.GETList projects
/projectsReturns projects visible to the API key. Filters combine with AND and the selected sort is deterministic.
List projects
/projectsQuery parameters
qstringCase-insensitive search across project name, website, description, folder, and tag name. Maximum: 200 characters.
folderstringMatch one folder, case-insensitively.
statusactive | inactive | archivedReturn projects in one lifecycle status.
project_modestandard | locations_onlyReturn projects in one mode.
tag_iduuidReturn projects assigned to this workspace tag.
sortcreated_at | updated_at | nameField used for ordering.
directionasc | descSort direction.
pageintegerThe 1-based page number.
per_pageintegerNumber of records per page, from 1 through 100. Values outside this range return 422.
Response envelope
projects:Project[]pagination:PaginationprojectsProject[]Matching projects in the requested deterministic sort order.
paginationPaginationPagination metadata.
Project
iduuidProject identifier.
workspace_iduuidIdentifier of the workspace that owns the project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringProject display name.
descriptionstring | nullProject description.
websitestring | nullNormalized HTTP or HTTPS website URL.
brand_aliasesstring[]Normalized alternative brand names.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
project_modestandard | locations_onlyStandard projects have their own tracking package. locations_only projects act as containers for independently packaged locations.
statusactive | inactive | archivedCurrent project lifecycle status.
packagePackageReference | nullAssigned project package. Null when project_mode is locations_only.
addressstring | nullNormalized street address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystringNormalized country name.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier when one is configured.
languagestringLowercase ISO 639-1 content language.
action_languagestring | nullLowercase ISO 639-1 language used for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanWhether local geographic context is emphasized.
local_contextobjectResolved geographic context used by project processing.
location_defaultsobjectDefault language, action language, website, and parent-brand settings available to locations in this project.
folderstring | nullOptional workspace organization folder.
tagsTag[]Up to three workspace tags assigned to the project.
logo_urlstring | nullAbsolute project logo URL when configured.
created_atdatetimeProject creation time in ISO 8601 format.
updated_atdatetimeMost recent project update time in ISO 8601 format.
PackageReference
iduuidAssigned package identifier.
namestringAssigned package name.
Competitor
iduuidCompetitor identifier.
kindcompetitorEntity role. Always competitor in this projection.
namestringCompetitor display name.
domainstringNormalized hostname without a scheme, path, query, leading www, or trailing dot. Required for tracked competitors.
aliasesstring[]Additional names recognized for the competitor.
statusactiveTracked competitors always participate in current processing.
competitor_statetrackedManagement lifecycle state. This projection contains tracked competitors only.
created_atdatetimeCompetitor creation time in ISO 8601 format.
updated_atdatetimeMost recent competitor update time in ISO 8601 format.
Tag
iduuidTag identifier.
namestringTag display name.
colorstringTag display color.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerNumber of records requested 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?q=acme&status=active&sort=created_at&direction=desc&page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"projects": [
{
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T08:00: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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
422validation_failedOne or more fields are invalid, or package_id does not identify an active package of the required type.
429rate_limit_exceededToo many requests were made.
POSTCreate project
/projectsSynchronously provisions a project and returns it. Optionally starts onboarding after creation.
Create project
/projectsRequest body
namestringRequired project name. Maximum: 200 characters.
project_modestandard | locations_onlyOptional project mode. Defaults to standard.
package_iduuidRequired for standard projects and omitted for locations_only projects. Must identify an active project package.
external_idstring | nullOptional partner identifier, unique across projects. Maximum: 200 characters.
websitestringRequired for standard projects. Valid HTTP or HTTPS URL; maximum 2,048 characters.
descriptionstring | nullOptional description. Maximum: 5,000 characters.
brand_aliasesstring[]Up to 10 alternative names, each at most 200 characters. Values are trimmed, lowercased, and deduplicated.
country_codestringUppercase ISO 3166-1 alpha-2 country code. Defaults to US.
countrystringCountry name. Defaults to country_code.
citystring | nullCity; required when focus is city. Maximum: 200 characters.
statestring | nullRegion or state. Maximum: 200 characters.
addressstring | nullStreet address. Maximum: 500 characters.
postal_codestring | nullPostal code. Maximum: 200 characters.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier. Maximum: 500 characters.
languageISO 639-1 stringContent language. Defaults to en.
action_languageISO 639-1 string | nullOptional language for generated actions.
focusglobal | country | region | cityGeographic targeting focus. Defaults to country.
local_modebooleanEnable local geographic context. Defaults to false.
folderstring | nullOptional organization folder. Maximum: 30 characters.
tag_idsuuid[]Up to three tag identifiers from this workspace.
tag_namesstring[]Up to three tag names. Names are trimmed and matched case-insensitively; missing names are created. Each name is 1–25 characters and the workspace may contain at most 50 tags. Takes precedence over tag_ids.
startbooleanWhen true, starts onboarding immediately after synchronous provisioning succeeds. Must be false for locations_only container projects. Defaults to false.
project_mode: "standard", package_id and website are required. For project_mode: "locations_only", omit package_id; locations created under the project select their own location packages.Response envelope
project:Projectonboarding_operation:OnboardingOperation | nullprojectProjectThe provisioned project.
onboarding_operationOnboardingOperation | nullPolling operation when start is true; null when onboarding was not requested.
Project
iduuidProject identifier.
workspace_iduuidIdentifier of the workspace that owns the project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringProject display name.
descriptionstring | nullProject description.
websitestring | nullNormalized HTTP or HTTPS website URL.
brand_aliasesstring[]Normalized alternative brand names.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
project_modestandard | locations_onlyStandard projects have their own tracking package. locations_only projects act as containers for independently packaged locations.
statusactive | inactive | archivedCurrent project lifecycle status.
packagePackageReference | nullAssigned project package. Null when project_mode is locations_only.
addressstring | nullNormalized street address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystringNormalized country name.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier when one is configured.
languagestringLowercase ISO 639-1 content language.
action_languagestring | nullLowercase ISO 639-1 language used for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanWhether local geographic context is emphasized.
local_contextobjectResolved geographic context used by project processing.
location_defaultsobjectDefault language, action language, website, and parent-brand settings available to locations in this project.
folderstring | nullOptional workspace organization folder.
tagsTag[]Up to three workspace tags assigned to the project.
logo_urlstring | nullAbsolute project logo URL when configured.
created_atdatetimeProject creation time in ISO 8601 format.
updated_atdatetimeMost recent project update time in ISO 8601 format.
PackageReference
iduuidAssigned package identifier.
namestringAssigned package name.
Competitor
iduuidCompetitor identifier.
kindcompetitorEntity role. Always competitor in this projection.
namestringCompetitor display name.
domainstringNormalized hostname without a scheme, path, query, leading www, or trailing dot. Required for tracked competitors.
aliasesstring[]Additional names recognized for the competitor.
statusactiveTracked competitors always participate in current processing.
competitor_statetrackedManagement lifecycle state. This projection contains tracked competitors only.
created_atdatetimeCompetitor creation time in ISO 8601 format.
updated_atdatetimeMost recent competitor update time in ISO 8601 format.
Tag
iduuidTag identifier.
namestringTag display name.
colorstringTag display color.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"name": "Acme Europe",
"external_id": "partner-project-acme",
"website": "https://acme.example",
"description": "European visibility program for Acme.",
"package_id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"country": "Netherlands",
"country_code": "NL",
"language": "en",
"focus": "country",
"start": false
}'HTTP/1.1 201 Created
{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T08:00:00Z"
},
"onboarding_operation": 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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
409conflictThe external ID is already in use or the resource cannot accept this operation in its current state.
422validation_failedOne or more fields are invalid, or package_id does not identify an active package of the required type.
429rate_limit_exceededToo many requests were made.
POSTBulk create projects
/projects/bulkAccepts up to 100 project create records and provisions them asynchronously with controlled workspace concurrency.
Bulk create projects
/projects/bulkRequest body
projectsProjectCreate[]Between 1 and 100 records using the same fields and validation as Create project.
Idempotency-Key header. Repeating the same request returns the existing operation. Reusing the key with a different body returns 409.start. start: true is rejected for a locations_only container; onboard its locations instead.Response envelope
bulk_operation:BulkOperationAccepted operation summary with an ID and status_url for polling.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/bulk' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Idempotency-Key: provision-2026-08-04-001' \
--header 'Content-Type: application/json' \
--data '{
"projects": [
{
"name": "Acme Europe",
"external_id": "partner-project-acme",
"website": "https://acme.example",
"description": "European visibility program for Acme.",
"package_id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"country": "Netherlands",
"country_code": "NL",
"language": "en",
"focus": "country",
"start": false
},
{
"name": "Acme locations",
"external_id": "partner-project-acme-locations",
"project_mode": "locations_only",
"start": false
}
]
}'HTTP/1.1 202 Accepted
{
"bulk_operation": {
"id": "f9bc15cc-e9c9-4e93-a93e-b713c92c7315",
"type": "projects",
"status": "pending",
"parent_project_id": null,
"total": 2,
"pending": 2,
"succeeded": 0,
"failed": 0,
"created_at": "2026-08-04T15:00:00Z",
"started_at": null,
"completed_at": null,
"status_url": "/v1/bulk-operations/f9bc15cc-e9c9-4e93-a93e-b713c92c7315"
}
}Poll the shared Get bulk operation endpoint for per-record results.
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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
409conflictThe external ID is already in use or the resource cannot accept this operation in its current state.
422validation_failedOne or more fields are invalid, or package_id does not identify an active package of the required type.
429rate_limit_exceededToo many requests were made.
GETGet project
/projects/{project_id}Returns one project by its Ceyo UUID.
Get project
/projects/{project_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Response envelope
project:ProjectThe requested, created, or updated project. The envelope is identical for UUID and external-ID lookup.
Project
iduuidProject identifier.
workspace_iduuidIdentifier of the workspace that owns the project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringProject display name.
descriptionstring | nullProject description.
websitestring | nullNormalized HTTP or HTTPS website URL.
brand_aliasesstring[]Normalized alternative brand names.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
project_modestandard | locations_onlyStandard projects have their own tracking package. locations_only projects act as containers for independently packaged locations.
statusactive | inactive | archivedCurrent project lifecycle status.
packagePackageReference | nullAssigned project package. Null when project_mode is locations_only.
addressstring | nullNormalized street address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystringNormalized country name.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier when one is configured.
languagestringLowercase ISO 639-1 content language.
action_languagestring | nullLowercase ISO 639-1 language used for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanWhether local geographic context is emphasized.
local_contextobjectResolved geographic context used by project processing.
location_defaultsobjectDefault language, action language, website, and parent-brand settings available to locations in this project.
folderstring | nullOptional workspace organization folder.
tagsTag[]Up to three workspace tags assigned to the project.
logo_urlstring | nullAbsolute project logo URL when configured.
created_atdatetimeProject creation time in ISO 8601 format.
updated_atdatetimeMost recent project update time in ISO 8601 format.
PackageReference
iduuidAssigned package identifier.
namestringAssigned package name.
Competitor
iduuidCompetitor identifier.
kindcompetitorEntity role. Always competitor in this projection.
namestringCompetitor display name.
domainstringNormalized hostname without a scheme, path, query, leading www, or trailing dot. Required for tracked competitors.
aliasesstring[]Additional names recognized for the competitor.
statusactiveTracked competitors always participate in current processing.
competitor_statetrackedManagement lifecycle state. This projection contains tracked competitors only.
created_atdatetimeCompetitor creation time in ISO 8601 format.
updated_atdatetimeMost recent competitor update time in ISO 8601 format.
Tag
iduuidTag identifier.
namestringTag display name.
colorstringTag display color.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T08:00: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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404not_foundThe requested project or location was not found.
429rate_limit_exceededToo many requests were made.
GETGet project overview
/projects/{project_id}/overviewReturns the project, a 30-day visibility summary, and location map markers.
Get project overview
/projects/{project_id}/overviewPath parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Response envelope
project:Projectvisibility_summary:VisibilitySummarymap:LocationMapprojectProjectCurrent project resource.
visibility_summaryVisibilitySummaryLatest completed 30-day visibility summary across active locations.
mapLocationMapActive location markers with valid coordinates.
VisibilitySummary
visibility_ratenumber | nullPercentage of included responses that mentioned the brand; null when unavailable.
avg_positionnumber | nullAverage 1-based brand position when present; null when no ranked mention is available.
LocationMap
markersLocationMarker[]Markers ordered by location name, then location ID. Only active locations with both coordinates are eligible.
LocationMarker
iduuidLocation identifier.
external_idstring | nullPartner-supplied location identifier.
namestringLocation display name.
formatted_addressstring | nullFormatted address used in map labels.
latitudenumberMarker latitude.
longitudenumberMarker longitude.
visibility_ratenumber | nullLatest 30-day brand visibility percentage.
avg_positionnumber | nullLatest 30-day average brand position.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/overview' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T08:00:00Z"
},
"visibility_summary": {
"visibility_rate": 68.4,
"avg_position": 2.7
},
"map": {
"markers": [
{
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"latitude": 52.3728,
"longitude": 4.8936,
"visibility_rate": 68.4,
"avg_position": 2.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": "validation_failed",
"message": "One or more fields are invalid.",
"details": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404not_foundThe requested project or location was not found.
429rate_limit_exceededToo many requests were made.
GETFind project by external ID
/projects/by-external-id/{external_id}Returns the project whose external_id exactly matches the URL-encoded path value.
Find project by external ID
/projects/by-external-id/{external_id}Path parameters
external_idstringURL-encoded, case-sensitive external ID previously assigned to the resource.
400; an unknown value returns 404.Response envelope
project:ProjectThe requested, created, or updated project. The envelope is identical for UUID and external-ID lookup.
Project
iduuidProject identifier.
workspace_iduuidIdentifier of the workspace that owns the project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringProject display name.
descriptionstring | nullProject description.
websitestring | nullNormalized HTTP or HTTPS website URL.
brand_aliasesstring[]Normalized alternative brand names.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
project_modestandard | locations_onlyStandard projects have their own tracking package. locations_only projects act as containers for independently packaged locations.
statusactive | inactive | archivedCurrent project lifecycle status.
packagePackageReference | nullAssigned project package. Null when project_mode is locations_only.
addressstring | nullNormalized street address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystringNormalized country name.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier when one is configured.
languagestringLowercase ISO 639-1 content language.
action_languagestring | nullLowercase ISO 639-1 language used for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanWhether local geographic context is emphasized.
local_contextobjectResolved geographic context used by project processing.
location_defaultsobjectDefault language, action language, website, and parent-brand settings available to locations in this project.
folderstring | nullOptional workspace organization folder.
tagsTag[]Up to three workspace tags assigned to the project.
logo_urlstring | nullAbsolute project logo URL when configured.
created_atdatetimeProject creation time in ISO 8601 format.
updated_atdatetimeMost recent project update time in ISO 8601 format.
PackageReference
iduuidAssigned package identifier.
namestringAssigned package name.
Competitor
iduuidCompetitor identifier.
kindcompetitorEntity role. Always competitor in this projection.
namestringCompetitor display name.
domainstringNormalized hostname without a scheme, path, query, leading www, or trailing dot. Required for tracked competitors.
aliasesstring[]Additional names recognized for the competitor.
statusactiveTracked competitors always participate in current processing.
competitor_statetrackedManagement lifecycle state. This projection contains tracked competitors only.
created_atdatetimeCompetitor creation time in ISO 8601 format.
updated_atdatetimeMost recent competitor update time in ISO 8601 format.
Tag
iduuidTag identifier.
namestringTag display name.
colorstringTag display color.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/by-external-id/partner-project-acme' \
--header 'Authorization: Bearer ceyo_platform_...'{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T08:00: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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404not_foundThe requested project or location was not found.
429rate_limit_exceededToo many requests were made.
PATCHUpdate project
/projects/{project_id}Updates only supplied project settings. Omitted fields remain unchanged.
Update project
/projects/{project_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
JSON request body
namestringNew project name. Maximum: 200 characters.
external_idstring | nullpartner identifier, unique across projects. Maximum: 200 characters.
descriptionstring | nulldescription. Maximum: 5,000 characters.
brand_aliasesstring[]Up to 10 alternative names, each at most 200 characters. Values are trimmed, lowercased, and deduplicated.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
countrystringCountry name.
citystring | nullCity; required when focus is city. Maximum: 200 characters.
statestring | nullRegion or state. Maximum: 200 characters.
addressstring | nullStreet address. Maximum: 500 characters.
postal_codestring | nullPostal code. Maximum: 200 characters.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier. Maximum: 500 characters.
languageISO 639-1 stringContent language.
action_languageISO 639-1 string | nulllanguage for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanEnable local geographic context.
folderstring | nullorganization folder. Maximum: 30 characters.
tag_idsuuid[]Up to three tag identifiers from this workspace.
tag_namesstring[]Up to three tag names. Names are trimmed and matched case-insensitively; missing names are created. Each name is 1–25 characters and the workspace may contain at most 50 tags. Takes precedence over tag_ids.
location_defaultsobjectReplacement defaults for location language, action_language, website, and include_parent_brand. These affect effective location behavior without changing explicit location values.
websitestring | nullReplacement normalized HTTP or HTTPS URL, maximum 2,048 characters. Standard projects cannot clear this field; locations_only projects may send null.
Multipart request body
namestringNew project name. Maximum: 200 characters.
external_idstring | nullpartner identifier, unique across projects. Maximum: 200 characters.
descriptionstring | nulldescription. Maximum: 5,000 characters.
brand_aliasesstring[]Up to 10 alternative names, each at most 200 characters. Values are trimmed, lowercased, and deduplicated.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
countrystringCountry name.
citystring | nullCity; required when focus is city. Maximum: 200 characters.
statestring | nullRegion or state. Maximum: 200 characters.
addressstring | nullStreet address. Maximum: 500 characters.
postal_codestring | nullPostal code. Maximum: 200 characters.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier. Maximum: 500 characters.
languageISO 639-1 stringContent language.
action_languageISO 639-1 string | nulllanguage for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanEnable local geographic context.
folderstring | nullorganization folder. Maximum: 30 characters.
tag_idsuuid[]Up to three tag identifiers from this workspace.
tag_namesstring[]Up to three tag names. Names are trimmed and matched case-insensitively; missing names are created. Each name is 1–25 characters and the workspace may contain at most 50 tags. Takes precedence over tag_ids.
location_defaultsobjectReplacement defaults for location language, action_language, website, and include_parent_brand. These affect effective location behavior without changing explicit location values.
websitestring | nullReplacement normalized HTTP or HTTPS URL, maximum 2,048 characters. Standard projects cannot clear this field; locations_only projects may send null.
logobinaryJPEG, PNG, or WebP image, maximum 5 MB. Replaces the current logo after validation.
remove_logobooleanSet true to remove the current logo. If logo is also supplied, the uploaded logo takes precedence and remove_logo is ignored.
project_mode and package assignment are immutable. Set nullable JSON fields to null to clear them. Empty alias and tag arrays clear their assignments. If both tag_names and tag_ids are supplied, tag_names wins. Missing tag names are created atomically; if the three-assignment or 50-tag workspace limit would be exceeded, no tags are changed.application/json when no file is involved. Use multipart/form-data to upload logo or set remove_logo=true; other fields retain the same validation and replacement semantics. Repeated tag_ids[], tag_names[], and brand_aliases[] parts represent arrays. A supplied logo takes precedence over remove_logo. Successful removal returns logo_url: null.Response envelope
project:ProjectThe requested, created, or updated project. The envelope is identical for UUID and external-ID lookup.
Project
iduuidProject identifier.
workspace_iduuidIdentifier of the workspace that owns the project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringProject display name.
descriptionstring | nullProject description.
websitestring | nullNormalized HTTP or HTTPS website URL.
brand_aliasesstring[]Normalized alternative brand names.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
project_modestandard | locations_onlyStandard projects have their own tracking package. locations_only projects act as containers for independently packaged locations.
statusactive | inactive | archivedCurrent project lifecycle status.
packagePackageReference | nullAssigned project package. Null when project_mode is locations_only.
addressstring | nullNormalized street address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystringNormalized country name.
country_codestringUppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
google_place_idstring | nullGoogle place identifier when one is configured.
languagestringLowercase ISO 639-1 content language.
action_languagestring | nullLowercase ISO 639-1 language used for generated actions.
focusglobal | country | region | cityGeographic targeting focus.
local_modebooleanWhether local geographic context is emphasized.
local_contextobjectResolved geographic context used by project processing.
location_defaultsobjectDefault language, action language, website, and parent-brand settings available to locations in this project.
folderstring | nullOptional workspace organization folder.
tagsTag[]Up to three workspace tags assigned to the project.
logo_urlstring | nullAbsolute project logo URL when configured.
created_atdatetimeProject creation time in ISO 8601 format.
updated_atdatetimeMost recent project update time in ISO 8601 format.
PackageReference
iduuidAssigned package identifier.
namestringAssigned package name.
Competitor
iduuidCompetitor identifier.
kindcompetitorEntity role. Always competitor in this projection.
namestringCompetitor display name.
domainstringNormalized hostname without a scheme, path, query, leading www, or trailing dot. Required for tracked competitors.
aliasesstring[]Additional names recognized for the competitor.
statusactiveTracked competitors always participate in current processing.
competitor_statetrackedManagement lifecycle state. This projection contains tracked competitors only.
created_atdatetimeCompetitor creation time in ISO 8601 format.
updated_atdatetimeMost recent competitor update time in ISO 8601 format.
Tag
iduuidTag identifier.
namestringTag display name.
colorstringTag display color.
Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"name": "Acme Europe & UK",
"external_id": "partner-project-acme-eu",
"brand_aliases": [
"acme",
"acme europe",
"acme uk"
],
"tag_names": [
"Retail",
"Europe"
]
}'{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme-eu",
"name": "Acme Europe & UK",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe",
"acme uk"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
},
{
"id": "b4e8bc5c-8282-4969-9d50-d8cf7723705a",
"name": "Europe",
"color": "#7C3AED"
}
],
"logo_url": null,
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T12:00:00Z"
}
}Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f' \
--header 'Authorization: Bearer ceyo_platform_...' \
--form 'tag_names[]=Retail' \
--form 'tag_names[]=Europe' \
--form 'logo=@./acme-logo.webp;type=image/webp' \
--form 'remove_logo=true'{
"project": {
"id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"workspace_id": "b7dd886f-b144-4ab4-907b-8efde9df881a",
"external_id": "partner-project-acme",
"name": "Acme Europe",
"description": "European visibility program for Acme.",
"website": "https://acme.example/",
"brand_aliases": [
"acme",
"acme europe"
],
"competitors": [
{
"id": "63ec8dad-c12f-43c8-89e4-06eb629d0977",
"kind": "competitor",
"name": "Example Rival",
"domain": "example-rival.com",
"aliases": [
"rival"
],
"status": "active",
"competitor_state": "tracked",
"created_at": "2026-07-02T11:20:00Z",
"updated_at": "2026-07-30T09:10:00Z"
}
],
"project_mode": "standard",
"status": "active",
"package": {
"id": "92404fd7-f096-49e9-9ab0-5ed73517d9db",
"name": "Growth Weekly"
},
"address": "1 Market Street",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"google_place_id": null,
"language": "en",
"action_language": "en",
"focus": "country",
"local_mode": false,
"local_context": {},
"location_defaults": {
"language": "en",
"action_language": "en",
"website": "https://acme.example/",
"include_parent_brand": true
},
"folder": "Europe",
"tags": [
{
"id": "30761d13-bc7e-45c8-8968-2147a37d6e54",
"name": "Retail",
"color": "#2563EB"
},
{
"id": "b4e8bc5c-8282-4969-9d50-d8cf7723705a",
"name": "Europe",
"color": "#7C3AED"
}
],
"logo_url": "https://api.ceyo.ai/media/logos/opaque-logo-token",
"created_at": "2026-07-31T08:00:00Z",
"updated_at": "2026-07-31T12:05: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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404not_foundThe requested project or location was not found.
409conflictThe external ID is already in use or the resource cannot accept this operation in its current state.
422validation_failedOne or more fields are invalid, or package_id does not identify an active package of the required type.
429rate_limit_exceededToo many requests were made.
DELETEDelete project
/projects/{project_id}Schedules asynchronous deletion of a project and all resources contained by it.
Delete project
/projects/{project_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f' \
--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": {
"name": [
"must be present"
]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_requestA path value, query parameter, or JSON body is malformed.
401invalid_api_keyThe Bearer API key is absent or invalid.
403forbiddenThe API key cannot perform this operation.
404not_foundThe requested project or location was not found.
429rate_limit_exceededToo many requests were made.