Locations
Provision and manage locations in the selected project.
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 locations
/projects/{project_id}/locationsReturns locations in a project. Filters combine with AND and the selected sort is deterministic.
List locations
/projects/{project_id}/locationsPath parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Query parameters
qstringCase-insensitive search across name, external_id, formatted address, city, state, postal code, country, phone, and email. Maximum: 200 characters.
statusactive | inactive | archivedReturn locations in one lifecycle status.
country_codeISO 3166-1 alpha-2 stringMatch the location’s explicit country code.
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
locations:Location[]pagination:PaginationlocationsLocation[]Matching locations in the requested deterministic sort order.
paginationPaginationPagination metadata.
Location
iduuidLocation identifier.
project_iduuidIdentifier of the containing project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringLocation display name.
descriptionstring | nullLocation description.
websitestring | nullNormalized HTTP or HTTPS location website.
brand_aliasesstring[]Normalized alternative names for the location brand.
languageISO 639-1 string | nullLocation content language, or null when not overridden.
action_languageISO 639-1 string | nullLocation action language, or null when not overridden.
include_parent_brandboolean | nullWhether the parent project brand is included.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
phonestring | nullPartner-supplied contact phone number.
emailstring | nullNormalized contact email address.
metadataobjectPartner-owned JSON metadata. Keys and values are returned without interpretation.
local_contextobjectPartner-supplied local facts used to contextualize processing.
focusglobal | country | region | cityConfigured geographic targeting focus.
google_place_idstring | nullGoogle place identifier.
google_place_sourceprovided | discovered | nullWhether the Google place was supplied by the customer or matched during onboarding.
google_place_namestring | nullBusiness name associated with the Google place.
google_maps_urlstring | nullGoogle Maps URL for the location.
formatted_addressstring | nullFormatted physical address.
address_line_2string | nullOptional second address line.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystring | nullNormalized country name.
country_codestring | nullExplicit uppercase ISO 3166-1 alpha-2 country code, or null when not configured. Locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
statusactive | inactive | archivedCurrent location lifecycle status.
packagePackageReferenceAssigned location package.
created_atdatetimeLocation creation time in ISO 8601 format.
updated_atdatetimeMost recent location 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.
Metadata and local context object
additional propertiesJSON valueArbitrary partner-owned keys with string, number, boolean, null, object, or array values.
maximum size16 KBLimit measured after JSON serialization.
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/e6c96c98-d777-40e0-94ec-48931f57782f/locations?q=amsterdam&status=active&sort=name&direction=asc&page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"locations": [
{
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"description": "Acme flagship store in Amsterdam.",
"website": "https://acme.example/amsterdam",
"brand_aliases": [
"acme amsterdam"
],
"language": "en",
"action_language": "en",
"include_parent_brand": true,
"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"
}
],
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_place_source": "provided",
"google_place_name": "Acme Amsterdam",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"address_line_2": null,
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": null,
"latitude": 52.3728,
"longitude": 4.8936,
"status": "active",
"package": {
"id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"name": "Local Growth Weekly"
},
"created_at": "2026-07-31T08:10:00Z",
"updated_at": "2026-07-31T08: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": {
"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.
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 location
/projects/{project_id}/locationsSynchronously provisions a location under a project and returns it. Optionally starts onboarding after creation.
Create location
/projects/{project_id}/locationsPath parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Request body
namestringRequired location name. Maximum: 200 characters.
package_iduuidRequired active location package identifier from the same workspace.
external_idstring | nullOptional partner identifier, unique among locations in this project.
descriptionstring | nullOptional description. Maximum: 5,000 characters.
websitestring | nullValid HTTP or HTTPS URL; maximum 2,048 characters.
brand_aliasesstring[]Up to 10 alternative names, each at most 200 characters. Values are normalized and deduplicated.
languageISO 639-1 string | nullOptional lowercase content-language override. Null uses the project location default, then en.
action_languageISO 639-1 string | nullOptional lowercase action-language override. Null uses the project location default, then the effective content language.
include_parent_brandboolean | nullOptional parent-brand override. Null uses the project location default.
phonestring | nullContact phone number; maximum 50 characters.
emailstring | nullValid contact email; maximum 320 characters.
metadataobjectPartner-owned JSON object, maximum serialized size 16 KB. Defaults to {}.
local_contextobjectLocal context JSON object, maximum serialized size 16 KB. Defaults to {}.
focusglobal | country | region | cityGeographic targeting focus. Defaults to city.
google_place_idstring | nullGoogle place identifier, unique in the project. When supplied, Ceyo validates it and resolves canonical place details. Maximum: 500 characters.
google_place_namestring | nullGoogle place business name. Maximum: 200 characters.
google_maps_urlstring | nullGoogle Maps URL. Maximum: 2,048 characters.
formatted_addressstring | nullFormatted physical address. Maximum: 500 characters.
address_line_2string | nullOptional suite, unit, or floor. Preserved separately from the canonical address. Maximum: 200 characters.
citystring | nullCity. Maximum: 200 characters.
statestring | nullRegion or state. Maximum: 200 characters.
postal_codestring | nullPostal code. Maximum: 200 characters.
countrystring | nullCountry name. Maximum: 200 characters.
country_codestring | nullISO 3166-1 alpha-2 code. Null leaves the location country code unset; locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90. Latitude and longitude must be supplied together.
longitudenumber | nullLongitude from -180 through 180. Latitude and longitude must be supplied together.
startbooleanWhen true, starts onboarding after provisioning. Supply either google_place_id or both city and country_code. Defaults to false.
package_id must identify an active location package in the same workspace. The location can provide its own country_code. If omitted, the location country code remains unset; it does not inherit the project country.google_place_id, Ceyo validates the place and fills canonical place details. Without it, provide your own location data. For start: true, city and country_code are enough; onboarding then tries to find a high-confidence Google match in the background.Response envelope
location:Locationonboarding_operation:OnboardingOperation | nulllocationLocationThe provisioned location.
onboarding_operationOnboardingOperation | nullPolling operation when start is true; null when onboarding was not requested.
Location
iduuidLocation identifier.
project_iduuidIdentifier of the containing project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringLocation display name.
descriptionstring | nullLocation description.
websitestring | nullNormalized HTTP or HTTPS location website.
brand_aliasesstring[]Normalized alternative names for the location brand.
languageISO 639-1 string | nullLocation content language, or null when not overridden.
action_languageISO 639-1 string | nullLocation action language, or null when not overridden.
include_parent_brandboolean | nullWhether the parent project brand is included.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
phonestring | nullPartner-supplied contact phone number.
emailstring | nullNormalized contact email address.
metadataobjectPartner-owned JSON metadata. Keys and values are returned without interpretation.
local_contextobjectPartner-supplied local facts used to contextualize processing.
focusglobal | country | region | cityConfigured geographic targeting focus.
google_place_idstring | nullGoogle place identifier.
google_place_sourceprovided | discovered | nullWhether the Google place was supplied by the customer or matched during onboarding.
google_place_namestring | nullBusiness name associated with the Google place.
google_maps_urlstring | nullGoogle Maps URL for the location.
formatted_addressstring | nullFormatted physical address.
address_line_2string | nullOptional second address line.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystring | nullNormalized country name.
country_codestring | nullExplicit uppercase ISO 3166-1 alpha-2 country code, or null when not configured. Locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
statusactive | inactive | archivedCurrent location lifecycle status.
packagePackageReferenceAssigned location package.
created_atdatetimeLocation creation time in ISO 8601 format.
updated_atdatetimeMost recent location 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.
Metadata and local context object
additional propertiesJSON valueArbitrary partner-owned keys with string, number, boolean, null, object, or array values.
maximum size16 KBLimit measured after JSON serialization.
Request and response
curl --request POST \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"name": "Acme Amsterdam",
"external_id": "partner-location-amsterdam",
"package_id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"website": "https://acme.example/amsterdam",
"language": "nl",
"action_language": "en",
"include_parent_brand": true,
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"address_line_2": "Suite 4",
"start": true
}'HTTP/1.1 201 Created
{
"location": {
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"description": "Acme flagship store in Amsterdam.",
"website": "https://acme.example/amsterdam",
"brand_aliases": [
"acme amsterdam"
],
"language": "en",
"action_language": "en",
"include_parent_brand": true,
"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"
}
],
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_place_source": "provided",
"google_place_name": "Acme Amsterdam",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"address_line_2": "Suite 4",
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": null,
"latitude": 52.3728,
"longitude": 4.8936,
"status": "active",
"package": {
"id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"name": "Local Growth Weekly"
},
"created_at": "2026-07-31T08:10:00Z",
"updated_at": "2026-07-31T08:10:00Z"
},
"onboarding_operation": {
"id": "1c07ea43-a8fe-4d07-8741-9c624d67b466",
"status": "queued",
"resource_type": "location",
"resource_id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"progress": {
"completed": 0,
"total": 6
},
"message": "Onboarding is queued.",
"steps": [
{
"key": "enrichment",
"status": "pending"
},
{
"key": "topics",
"status": "pending"
},
{
"key": "prompts",
"status": "pending"
},
{
"key": "competitors",
"status": "pending"
},
{
"key": "visibility",
"status": "pending"
},
{
"key": "diagnosis",
"status": "pending"
}
],
"status_url": "/v1/onboarding-operations/1c07ea43-a8fe-4d07-8741-9c624d67b466",
"created_at": "2026-08-04T15:00:00Z",
"updated_at": "2026-08-04T15: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.
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.
503place_details_unavailableA supplied Google Place ID could not be resolved because place details are temporarily unavailable.
POSTBulk create locations
/projects/{project_id}/locations/bulkAccepts up to 100 location create records and provisions them asynchronously under one project.
Bulk create locations
/projects/{project_id}/locations/bulkPath parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Request body
locationsLocationCreate[]Between 1 and 100 records using the same fields and validation as Create location.
Idempotency-Key header. Repeating the same request returns the existing operation. Reusing the key with a different body returns 409.start separately on each record. Successful records with start: true enqueue location onboarding; one failed record does not roll back the others.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/e6c96c98-d777-40e0-94ec-48931f57782f/locations/bulk' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Idempotency-Key: provision-2026-08-04-001' \
--header 'Content-Type: application/json' \
--data '{
"locations": [
{
"name": "Acme Amsterdam",
"external_id": "partner-location-amsterdam",
"package_id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"website": "https://acme.example/amsterdam",
"language": "nl",
"action_language": "en",
"include_parent_brand": true,
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"address_line_2": "Suite 4",
"start": true
},
{
"name": "Acme Rotterdam",
"external_id": "partner-location-rotterdam",
"package_id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"website": "https://acme.example/amsterdam",
"language": "nl",
"action_language": "en",
"include_parent_brand": true,
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"address_line_2": "Suite 4",
"start": true,
"city": "Rotterdam"
}
]
}'HTTP/1.1 202 Accepted
{
"bulk_operation": {
"id": "f9bc15cc-e9c9-4e93-a93e-b713c92c7315",
"type": "locations",
"status": "pending",
"parent_project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"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.
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.
GETGet location
/projects/{project_id}/locations/{location_id}Returns one location by its Ceyo UUID within the selected project.
Get location
/projects/{project_id}/locations/{location_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
location_idlocation UUID | location external IDCeyo location UUID or configured partner external ID belonging to the project.
Response envelope
location:LocationThe requested, created, or updated location. The envelope is identical for UUID and external-ID lookup.
Location
iduuidLocation identifier.
project_iduuidIdentifier of the containing project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringLocation display name.
descriptionstring | nullLocation description.
websitestring | nullNormalized HTTP or HTTPS location website.
brand_aliasesstring[]Normalized alternative names for the location brand.
languageISO 639-1 string | nullLocation content language, or null when not overridden.
action_languageISO 639-1 string | nullLocation action language, or null when not overridden.
include_parent_brandboolean | nullWhether the parent project brand is included.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
phonestring | nullPartner-supplied contact phone number.
emailstring | nullNormalized contact email address.
metadataobjectPartner-owned JSON metadata. Keys and values are returned without interpretation.
local_contextobjectPartner-supplied local facts used to contextualize processing.
focusglobal | country | region | cityConfigured geographic targeting focus.
google_place_idstring | nullGoogle place identifier.
google_place_sourceprovided | discovered | nullWhether the Google place was supplied by the customer or matched during onboarding.
google_place_namestring | nullBusiness name associated with the Google place.
google_maps_urlstring | nullGoogle Maps URL for the location.
formatted_addressstring | nullFormatted physical address.
address_line_2string | nullOptional second address line.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystring | nullNormalized country name.
country_codestring | nullExplicit uppercase ISO 3166-1 alpha-2 country code, or null when not configured. Locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
statusactive | inactive | archivedCurrent location lifecycle status.
packagePackageReferenceAssigned location package.
created_atdatetimeLocation creation time in ISO 8601 format.
updated_atdatetimeMost recent location 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.
Metadata and local context object
additional propertiesJSON valueArbitrary partner-owned keys with string, number, boolean, null, object, or array values.
maximum size16 KBLimit measured after JSON serialization.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/a1308d14-149c-4dd7-a4c5-295ac9090f58' \
--header 'Authorization: Bearer ceyo_platform_...'{
"location": {
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"description": "Acme flagship store in Amsterdam.",
"website": "https://acme.example/amsterdam",
"brand_aliases": [
"acme amsterdam"
],
"language": "en",
"action_language": "en",
"include_parent_brand": true,
"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"
}
],
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_place_source": "provided",
"google_place_name": "Acme Amsterdam",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"address_line_2": null,
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": null,
"latitude": 52.3728,
"longitude": 4.8936,
"status": "active",
"package": {
"id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"name": "Local Growth Weekly"
},
"created_at": "2026-07-31T08:10:00Z",
"updated_at": "2026-07-31T08: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": {
"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 locations overview
/projects/{project_id}/locations/overviewReturns a paginated location comparison view and map markers for the filtered result set.
Get locations overview
/projects/{project_id}/locations/overviewPath parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
Query parameters
qstringCase-insensitive search across location name, external_id, formatted address, city, state, postal code, and country. Maximum: 200 characters.
statusactive | inactiveReturn one non-archived lifecycle status. Archived locations are excluded.
country_codeISO 3166-1 alpha-2 stringMatch the location’s explicit country code.
sortname | visibility_rate | avg_positionField used for ordering. Null metrics sort after non-null values in either direction.
directionasc | descSort direction. When sort is not name and direction is omitted, the default is desc.
pageintegerThe 1-based page number.
per_pageintegerNumber of records per page, from 1 through 100. Values outside this range return 422.
Response envelope
locations:LocationOverview[]pagination:Paginationmap:LocationMaplocationsLocationOverview[]The requested page of matching locations.
paginationPaginationPagination over the filtered and sorted location set.
mapLocationMapMarkers for the complete filtered set.
LocationOverview
iduuidLocation identifier.
external_idstring | nullPartner-supplied location identifier.
namestringLocation display name.
statusactive | inactiveCurrent non-archived lifecycle status.
formatted_addressstring | nullFormatted physical address.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
country_codestringEffective uppercase ISO 3166-1 alpha-2 country code.
latitudenumber | nullLatitude, or null when unavailable.
longitudenumber | nullLongitude, or null when unavailable.
visibility_summaryVisibilitySummaryLatest completed 30-day location visibility summary.
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.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerNumber of records requested per page.
totalintegerTotal records matching the request.
total_pagesintegerTotal available pages.
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.
locations only. Every sort uses name and then location ID as ascending tie-breakers.Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/overview?q=amsterdam&status=active&sort=visibility_rate&direction=desc&page=1&per_page=25' \
--header 'Authorization: Bearer ceyo_platform_...'{
"locations": [
{
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"status": "active",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"city": "Amsterdam",
"state": "North Holland",
"country_code": "NL",
"latitude": 52.3728,
"longitude": 4.8936,
"visibility_summary": {
"visibility_rate": 68.4,
"avg_position": 2.7
}
}
],
"pagination": {
"page": 1,
"per_page": 25,
"total": 1,
"total_pages": 1
},
"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.
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.
GETFind location by external ID
/projects/{project_id}/locations/by-external-id/{external_id}Returns the location whose external_id exactly matches the URL-encoded value within the selected project.
Find location by external ID
/projects/{project_id}/locations/by-external-id/{external_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
external_idstringURL-encoded, case-sensitive external ID previously assigned to the resource.
400; an unknown value or a value assigned in another project returns 404.Response envelope
location:LocationThe requested, created, or updated location. The envelope is identical for UUID and external-ID lookup.
Location
iduuidLocation identifier.
project_iduuidIdentifier of the containing project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringLocation display name.
descriptionstring | nullLocation description.
websitestring | nullNormalized HTTP or HTTPS location website.
brand_aliasesstring[]Normalized alternative names for the location brand.
languageISO 639-1 string | nullLocation content language, or null when not overridden.
action_languageISO 639-1 string | nullLocation action language, or null when not overridden.
include_parent_brandboolean | nullWhether the parent project brand is included.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
phonestring | nullPartner-supplied contact phone number.
emailstring | nullNormalized contact email address.
metadataobjectPartner-owned JSON metadata. Keys and values are returned without interpretation.
local_contextobjectPartner-supplied local facts used to contextualize processing.
focusglobal | country | region | cityConfigured geographic targeting focus.
google_place_idstring | nullGoogle place identifier.
google_place_sourceprovided | discovered | nullWhether the Google place was supplied by the customer or matched during onboarding.
google_place_namestring | nullBusiness name associated with the Google place.
google_maps_urlstring | nullGoogle Maps URL for the location.
formatted_addressstring | nullFormatted physical address.
address_line_2string | nullOptional second address line.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystring | nullNormalized country name.
country_codestring | nullExplicit uppercase ISO 3166-1 alpha-2 country code, or null when not configured. Locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
statusactive | inactive | archivedCurrent location lifecycle status.
packagePackageReferenceAssigned location package.
created_atdatetimeLocation creation time in ISO 8601 format.
updated_atdatetimeMost recent location 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.
Metadata and local context object
additional propertiesJSON valueArbitrary partner-owned keys with string, number, boolean, null, object, or array values.
maximum size16 KBLimit measured after JSON serialization.
Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/by-external-id/partner-location-amsterdam' \
--header 'Authorization: Bearer ceyo_platform_...'{
"location": {
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam",
"description": "Acme flagship store in Amsterdam.",
"website": "https://acme.example/amsterdam",
"brand_aliases": [
"acme amsterdam"
],
"language": "en",
"action_language": "en",
"include_parent_brand": true,
"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"
}
],
"phone": "+31 20 555 0100",
"email": "amsterdam@acme.example",
"metadata": {
"partner_region_id": "nl-west"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_place_source": "provided",
"google_place_name": "Acme Amsterdam",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"address_line_2": null,
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": null,
"latitude": 52.3728,
"longitude": 4.8936,
"status": "active",
"package": {
"id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"name": "Local Growth Weekly"
},
"created_at": "2026-07-31T08:10:00Z",
"updated_at": "2026-07-31T08: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": {
"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 location
/projects/{project_id}/locations/{location_id}Updates only supplied location settings. Omitted fields remain unchanged.
Update location
/projects/{project_id}/locations/{location_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
location_idlocation UUID | location external IDCeyo location UUID or configured partner external ID belonging to the project.
Request body
namestringNew location name. Maximum: 200 characters.
external_idstring | nullpartner identifier, unique among locations in this project.
descriptionstring | nulldescription. Maximum: 5,000 characters.
websitestring | nullValid HTTP or HTTPS URL; maximum 2,048 characters.
brand_aliasesstring[]Up to 10 alternative names, each at most 200 characters. Values are normalized and deduplicated.
languageISO 639-1 string | nulllowercase content-language override. Null uses the project location default, then en.
action_languageISO 639-1 string | nulllowercase action-language override. Null uses the project location default, then the effective content language.
include_parent_brandboolean | nullparent-brand override. Null uses the project location default.
phonestring | nullContact phone number; maximum 50 characters.
emailstring | nullValid contact email; maximum 320 characters.
metadataobjectPartner-owned JSON object, maximum serialized size 16 KB.
local_contextobjectLocal context JSON object, maximum serialized size 16 KB.
focusglobal | country | region | cityGeographic targeting focus.
google_place_idstring | nullGoogle place identifier, unique in the project. When supplied, Ceyo validates it and resolves canonical place details. Maximum: 500 characters.
google_place_namestring | nullGoogle place business name. Maximum: 200 characters.
google_maps_urlstring | nullGoogle Maps URL. Maximum: 2,048 characters.
formatted_addressstring | nullFormatted physical address. Maximum: 500 characters.
address_line_2string | nullsuite, unit, or floor. Preserved separately from the canonical address. Maximum: 200 characters.
citystring | nullCity. Maximum: 200 characters.
statestring | nullRegion or state. Maximum: 200 characters.
postal_codestring | nullPostal code. Maximum: 200 characters.
countrystring | nullCountry name. Maximum: 200 characters.
country_codestring | nullISO 3166-1 alpha-2 code. Null leaves the location country code unset; locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90. Latitude and longitude must be supplied together.
longitudenumber | nullLongitude from -180 through 180. Latitude and longitude must be supplied together.
address_line_2string | nullReplacement optional second address line.
null to clear them. metadata and local_context replace their complete objects; send {} to clear their keys. An empty brand_aliases array removes all aliases.Response envelope
location:LocationThe requested, created, or updated location. The envelope is identical for UUID and external-ID lookup.
Location
iduuidLocation identifier.
project_iduuidIdentifier of the containing project.
external_idstring | nullCase-sensitive identifier supplied by the partner.
namestringLocation display name.
descriptionstring | nullLocation description.
websitestring | nullNormalized HTTP or HTTPS location website.
brand_aliasesstring[]Normalized alternative names for the location brand.
languageISO 639-1 string | nullLocation content language, or null when not overridden.
action_languageISO 639-1 string | nullLocation action language, or null when not overridden.
include_parent_brandboolean | nullWhether the parent project brand is included.
competitorsCompetitor[]Active tracked competitors. Compatible tracked projection of the dedicated Competitors contract; suggested and dismissed records are excluded.
phonestring | nullPartner-supplied contact phone number.
emailstring | nullNormalized contact email address.
metadataobjectPartner-owned JSON metadata. Keys and values are returned without interpretation.
local_contextobjectPartner-supplied local facts used to contextualize processing.
focusglobal | country | region | cityConfigured geographic targeting focus.
google_place_idstring | nullGoogle place identifier.
google_place_sourceprovided | discovered | nullWhether the Google place was supplied by the customer or matched during onboarding.
google_place_namestring | nullBusiness name associated with the Google place.
google_maps_urlstring | nullGoogle Maps URL for the location.
formatted_addressstring | nullFormatted physical address.
address_line_2string | nullOptional second address line.
citystring | nullNormalized city.
statestring | nullNormalized region or state.
postal_codestring | nullNormalized postal code.
countrystring | nullNormalized country name.
country_codestring | nullExplicit uppercase ISO 3166-1 alpha-2 country code, or null when not configured. Locations do not inherit the project country.
latitudenumber | nullLatitude from -90 through 90.
longitudenumber | nullLongitude from -180 through 180.
statusactive | inactive | archivedCurrent location lifecycle status.
packagePackageReferenceAssigned location package.
created_atdatetimeLocation creation time in ISO 8601 format.
updated_atdatetimeMost recent location 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.
Metadata and local context object
additional propertiesJSON valueArbitrary partner-owned keys with string, number, boolean, null, object, or array values.
maximum size16 KBLimit measured after JSON serialization.
Request and response
curl --request PATCH \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/a1308d14-149c-4dd7-a4c5-295ac9090f58' \
--header 'Authorization: Bearer ceyo_platform_...' \
--header 'Content-Type: application/json' \
--data '{
"name": "Acme Amsterdam Centrum",
"description": "Acme flagship store in central Amsterdam.",
"brand_aliases": [
"acme amsterdam",
"acme centrum"
],
"phone": "+31 20 555 0199",
"email": "centrum@acme.example",
"metadata": {
"partner_region_id": "nl-central"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam city center"
},
"focus": "city"
}'{
"location": {
"id": "a1308d14-149c-4dd7-a4c5-295ac9090f58",
"project_id": "e6c96c98-d777-40e0-94ec-48931f57782f",
"external_id": "partner-location-amsterdam",
"name": "Acme Amsterdam Centrum",
"description": "Acme flagship store in central Amsterdam.",
"website": "https://acme.example/amsterdam",
"brand_aliases": [
"acme amsterdam",
"acme centrum"
],
"language": "en",
"action_language": "en",
"include_parent_brand": true,
"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"
}
],
"phone": "+31 20 555 0199",
"email": "centrum@acme.example",
"metadata": {
"partner_region_id": "nl-central"
},
"local_context": {
"neighborhood": "Centrum",
"service_area": "Amsterdam city center"
},
"focus": "city",
"google_place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"google_place_source": "provided",
"google_place_name": "Acme Amsterdam",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"formatted_address": "1 Market Street, 1012 JS Amsterdam, Netherlands",
"address_line_2": null,
"city": "Amsterdam",
"state": "North Holland",
"postal_code": "1012 JS",
"country": "Netherlands",
"country_code": null,
"latitude": 52.3728,
"longitude": 4.8936,
"status": "active",
"package": {
"id": "8ae92d3f-18fb-4899-aef0-11f50b8bd0a7",
"name": "Local Growth Weekly"
},
"created_at": "2026-07-31T08:10:00Z",
"updated_at": "2026-07-31T12: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": {
"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 location
/projects/{project_id}/locations/{location_id}Schedules asynchronous deletion of a location and its location-scoped resources.
Delete location
/projects/{project_id}/locations/{location_id}Path parameters
project_idproject UUID | project external IDCeyo project UUID or configured partner external ID.
location_idlocation UUID | location external IDCeyo location UUID or configured partner external ID belonging to the project.
Request and response
curl --request DELETE \
--url 'https://api.signal.ceyo.ai/v1/projects/e6c96c98-d777-40e0-94ec-48931f57782f/locations/a1308d14-149c-4dd7-a4c5-295ac9090f58' \
--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.