Listings
Read a location's configured listing identity, observed profile, scheduled scan records, and listing findings.
Authorization header as Bearer ceyo_platform_..., or in X-Api-Key. The key requires listings:read and access to the requested project and location. Project and location path identifiers accept Ceyo UUIDs or partner external IDs.GETGet listing profile
/projects/{project_id}/locations/{location_id}/listings/profileReturns the listing identity, newest retained profile, and latest scan summary for a location.
Get listing profile
/projects/{project_id}/locations/{location_id}/listings/profilePath parameters
project_idproject UUID | project external IDProject identifier.
location_idlocation UUID | location external IDLocation identifier belonging to the project.
Response envelope
listing:ConfiguredListing | nullprofile:ListingProfile | nulllatest_scan:ScanSummary | nulllistingConfiguredListing | nullConfigured listing identity, or null when listings are disabled or the location has no configured place.
profileListingProfile | nullProfile from the newest succeeded scan with available profile data, or null when unavailable.
latest_scanScanSummary | nullNewest listing scan summary, or null before any scan.
ConfiguredListing
namestringConfigured listing or location name.
addressstring | nullConfigured location address.
google_maps_urlstring | nullPublic Google Maps URL for the configured place.
ListingProfile
place_idstringPlace identifier represented by this profile.
namestring | nullPublic business name.
formatted_addressstring | nullPublicly formatted business address.
website_urlstring | nullPublic website linked from the listing.
national_phone_numberstring | nullPhone number formatted for the listing country.
international_phone_numberstring | nullPhone number in international format.
google_maps_urlstring | nullPublic Google Maps URL.
business_statusstring | nullCurrent public operating status.
primary_typestring | nullMachine-readable primary business type.
primary_type_display_namestring | nullDisplay name for the primary business type.
typesstring[]Normalized business type keys associated with the place.
ratingnumber | nullPublic average review rating.
review_countinteger | nullNumber of public ratings represented by the average.
regular_opening_hoursOpeningHours | nullNormalized weekly opening schedule and special-day notices.
editorial_summarystring | nullPublic editorial description of the business.
reviewsReview[]Up to the 50 most recent public reviews available with the profile.
attributesListingAttributesNormalized service, accessibility, parking, payment, dining, and amenity attributes.
OpeningHours
open_nowboolean | nullWhether the business is open at the profile observation time.
periodsOpeningPeriod[]Weekly periods containing open and, when applicable, close day and time values.
weekday_descriptionsstring[]Human-readable hours for each represented weekday.
special_daysSpecialDay[]Special-day entries with an ISO date and an exceptional_hours flag.
OpeningPeriod
openOpeningPointOpening point with day, hour, minute, and optional date.
closeOpeningPoint | nullClosing point when the period has a defined close time.
OpeningPoint
dayintegerDay of week from 0 (Sunday) through 6 (Saturday).
hourintegerHour from 0 through 23.
minuteintegerMinute from 0 through 59.
datedateCalendar date when the point represents a dated schedule. Omitted otherwise.
SpecialDay
dateISO dateCalendar date in YYYY-MM-DD format.
exceptional_hoursbooleanWhether the date uses hours that differ from the regular schedule.
Review
ratingnumber | nullReview rating.
textstring | nullPublic review text.
publish_timedatetime | nullReview publication time.
relative_publish_timestring | nullHuman-readable relative publication time.
google_maps_urlstring | nullPublic Google Maps URL for the review.
authorReviewAuthor | nullPublic reviewer attribution when available.
ReviewAuthor
display_namestring | nullPublic display name of the reviewer.
uristring | nullPublic reviewer profile URL.
photo_uristring | nullPublic reviewer profile image URL.
ListingAttributes
accessibility_optionsBooleanAttributeMapNormalized boolean accessibility options keyed by snake_case attribute names.
payment_optionsBooleanAttributeMapNormalized boolean payment options keyed by snake_case attribute names.
parking_optionsBooleanAttributeMapNormalized boolean parking options keyed by snake_case attribute names.
deliveryboolean | nullWhether delivery is offered.
dine_inboolean | nullWhether dine-in service is offered.
takeoutboolean | nullWhether takeout is offered.
reservableboolean | nullWhether reservations are accepted.
serves_breakfastboolean | nullWhether breakfast is served.
serves_lunchboolean | nullWhether lunch is served.
serves_dinnerboolean | nullWhether dinner is served.
serves_beerboolean | nullWhether beer is served.
serves_wineboolean | nullWhether wine is served.
serves_vegetarian_foodboolean | nullWhether vegetarian food is served.
BooleanAttributeMap
{attribute_name}booleanBoolean value keyed by a snake_case accessibility, payment, or parking attribute name.
ScanSummary
iduuidListing scan identifier.
statuspending | running | succeeded | failed | skippedCurrent or terminal scan status.
scoreinteger | nullListing quality score from 0 to 100 when available.
gradestrong | good | needs_attention | weak | nullQuality grade derived from the score.
error_messagestring | nullCustomer-safe explanation when the scan failed.
completed_atdatetime | nullTime scan processing reached a terminal status.
created_atdatetimeTime the scan was created.
null.profile is selected from the newest succeeded scan with a non-empty retained profile. It is null when no such profile is available. Detailed profile data is retained for 29 days; historical scan scores and checks remain available through the scan endpoints.200 when no listing data is available. In that case, listing, profile, and latest_scan are null.Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/locations/{location_id}/listings/profile' \
--header 'Authorization: Bearer ceyo_platform_...'{
"listing": {
"name": "Harbour Coffee",
"address": "12 Market Street, Dublin 2, Ireland",
"google_maps_url": "https://maps.google.com/?cid=123456789"
},
"profile": {
"place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"name": "Harbour Coffee",
"formatted_address": "12 Market Street, Dublin 2, Ireland",
"website_url": "https://harbourcoffee.example",
"national_phone_number": "01 555 0142",
"international_phone_number": "+353 1 555 0142",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"business_status": "OPERATIONAL",
"primary_type": "coffee_shop",
"primary_type_display_name": "Coffee shop",
"types": ["coffee_shop", "cafe", "food"],
"rating": 4.6,
"review_count": 187,
"regular_opening_hours": {
"open_now": true,
"periods": [
{
"open": {"day": 1, "hour": 7, "minute": 30},
"close": {"day": 1, "hour": 18, "minute": 0}
}
],
"weekday_descriptions": [
"Monday: 7:30 AM – 6:00 PM",
"Tuesday: 7:30 AM – 6:00 PM"
],
"special_days": [
{
"date": "2026-08-03",
"exceptional_hours": true
}
]
},
"editorial_summary": "Independent coffee shop serving seasonal drinks.",
"reviews": [
{
"rating": 5,
"text": "Friendly team and excellent coffee.",
"publish_time": "2026-07-25T11:14:00Z",
"relative_publish_time": "a week ago",
"google_maps_url": "https://maps.google.com/reviews/example",
"author": {
"display_name": "A. Customer",
"uri": "https://maps.google.com/maps/contrib/456",
"photo_uri": "https://lh3.googleusercontent.com/a/reviewer"
}
}
],
"attributes": {
"accessibility_options": {"wheelchair_accessible_entrance": true},
"payment_options": {"accepts_credit_cards": true},
"parking_options": {"street_parking": true},
"delivery": false,
"dine_in": true,
"takeout": true,
"reservable": false,
"serves_breakfast": true,
"serves_lunch": true,
"serves_dinner": false,
"serves_beer": false,
"serves_wine": false,
"serves_vegetarian_food": true
}
},
"latest_scan": {
"id": "ea0c4cdd-430e-444e-8446-cbe8d47edb56",
"status": "succeeded",
"score": 82,
"grade": "good",
"error_message": null,
"completed_at": "2026-07-30T09:40:03Z",
"created_at": "2026-07-30T09:39:58Z"
}
}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": "not_found",
"message": "The requested resource was not found.",
"details": null,
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyThe API key is absent, invalid, expired, or revoked.
403forbiddenThe API key lacks listings:read or cannot access the requested location.
404not_foundThe project, location, or visibility scope was not found.
429rate_limit_exceededToo many requests were made.
GETList listing scans
/projects/{project_id}/locations/{location_id}/listings/scansReturns listing scan summaries for a location, ordered newest first.
List listing scans
/projects/{project_id}/locations/{location_id}/listings/scansPath parameters
project_idproject UUID | project external IDProject identifier.
location_idlocation UUID | location external IDLocation identifier belonging to the project.
Query parameters
pageintegerThe 1-based page number.
per_pageintegerNumber of scans per page. Maximum: 50.
Response envelope
scans:ScanSummary[]pagination:PaginationscansScanSummary[]Scan summaries ordered newest first.
paginationPaginationPagination metadata.
ScanSummary
iduuidListing scan identifier.
statuspending | running | succeeded | failed | skippedCurrent or terminal scan status.
scoreinteger | nullListing quality score from 0 to 100 when available.
gradestrong | good | needs_attention | weak | nullQuality grade derived from the score.
error_messagestring | nullCustomer-safe explanation when the scan failed.
completed_atdatetime | nullTime scan processing reached a terminal status.
created_atdatetimeTime the scan was created.
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/{project_id}/locations/{location_id}/listings/scans?page=1&per_page=20' \
--header 'Authorization: Bearer ceyo_platform_...'{
"scans": [
{
"id": "ea0c4cdd-430e-444e-8446-cbe8d47edb56",
"status": "succeeded",
"score": 82,
"grade": "good",
"error_message": null,
"completed_at": "2026-07-30T09:40:03Z",
"created_at": "2026-07-30T09:39:58Z"
},
{
"id": "04af8634-f960-47cb-9522-98714f87ff36",
"status": "failed",
"score": null,
"grade": null,
"error_message": "Listing scan did not complete.",
"completed_at": "2026-07-23T09:40:08Z",
"created_at": "2026-07-23T09:39:58Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"total": 9,
"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": "page must be positive and per_page must be between 1 and 50.",
"details": null,
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyThe API key is absent, invalid, expired, or revoked.
403forbiddenThe API key lacks listings:read or cannot access the requested location.
404not_foundThe project, location, or visibility scope was not found.
422validation_failedpage or per_page is outside the supported range.
429rate_limit_exceededToo many requests were made.
GETGet listing scan
/projects/{project_id}/locations/{location_id}/listings/scans/{scan_id}Returns one listing scan with its complete scored result and checks.
Get listing scan
/projects/{project_id}/locations/{location_id}/listings/scans/{scan_id}Path parameters
project_idproject UUID | project external IDProject identifier.
location_idlocation UUID | location external IDLocation identifier belonging to the project.
scan_iduuidListing scan identifier.
Response envelope
scan:ListingScanRequested listing scan and its complete result.
ListingScan
iduuidListing scan identifier.
statuspending | running | succeeded | failed | skippedCurrent or terminal scan status.
scoreinteger | nullListing quality score from 0 to 100 when available.
gradestrong | good | needs_attention | weak | nullQuality grade derived from the score.
error_messagestring | nullCustomer-safe explanation when the scan failed.
completed_atdatetime | nullTime scan processing reached a terminal status.
created_atdatetimeTime the scan was created.
resultScanResult | nullComplete scored result on the single-scan endpoint. Null for unscored, failed, or skipped scans.
ScanResult
scoreintegerOverall listing quality score from 0 to 100.
gradestrong | good | needs_attention | weakOverall grade derived from the score.
summarystringShort interpretation of the listing assessment.
profileListingProfile | nullProfile observed for this scan, or null when detailed profile data is no longer retained.
checksListingCheck[]Scored checks that contributed to the result.
ListingCheck
labelstringHuman-readable check label.
statuspassed | warning | failedCheck outcome.
scoreintegerPoints awarded by this check.
severitylow | medium | highImportance of the observed condition.
categorystringCategory used to group related checks.
messagestringExplanation of the observed condition.
recommendationstringRecommended response to the check outcome.
ListingProfile
place_idstringPlace identifier represented by this profile.
namestring | nullPublic business name.
formatted_addressstring | nullPublicly formatted business address.
website_urlstring | nullPublic website linked from the listing.
national_phone_numberstring | nullPhone number formatted for the listing country.
international_phone_numberstring | nullPhone number in international format.
google_maps_urlstring | nullPublic Google Maps URL.
business_statusstring | nullCurrent public operating status.
primary_typestring | nullMachine-readable primary business type.
primary_type_display_namestring | nullDisplay name for the primary business type.
typesstring[]Normalized business type keys associated with the place.
ratingnumber | nullPublic average review rating.
review_countinteger | nullNumber of public ratings represented by the average.
regular_opening_hoursOpeningHours | nullNormalized weekly opening schedule and special-day notices.
editorial_summarystring | nullPublic editorial description of the business.
reviewsReview[]Up to the 50 most recent public reviews available with the profile.
attributesListingAttributesNormalized service, accessibility, parking, payment, dining, and amenity attributes.
OpeningHours
open_nowboolean | nullWhether the business is open at the profile observation time.
periodsOpeningPeriod[]Weekly periods containing open and, when applicable, close day and time values.
weekday_descriptionsstring[]Human-readable hours for each represented weekday.
special_daysSpecialDay[]Special-day entries with an ISO date and an exceptional_hours flag.
OpeningPeriod
openOpeningPointOpening point with day, hour, minute, and optional date.
closeOpeningPoint | nullClosing point when the period has a defined close time.
OpeningPoint
dayintegerDay of week from 0 (Sunday) through 6 (Saturday).
hourintegerHour from 0 through 23.
minuteintegerMinute from 0 through 59.
datedateCalendar date when the point represents a dated schedule. Omitted otherwise.
SpecialDay
dateISO dateCalendar date in YYYY-MM-DD format.
exceptional_hoursbooleanWhether the date uses hours that differ from the regular schedule.
Review
ratingnumber | nullReview rating.
textstring | nullPublic review text.
publish_timedatetime | nullReview publication time.
relative_publish_timestring | nullHuman-readable relative publication time.
google_maps_urlstring | nullPublic Google Maps URL for the review.
authorReviewAuthor | nullPublic reviewer attribution when available.
ReviewAuthor
display_namestring | nullPublic display name of the reviewer.
uristring | nullPublic reviewer profile URL.
photo_uristring | nullPublic reviewer profile image URL.
ListingAttributes
accessibility_optionsBooleanAttributeMapNormalized boolean accessibility options keyed by snake_case attribute names.
payment_optionsBooleanAttributeMapNormalized boolean payment options keyed by snake_case attribute names.
parking_optionsBooleanAttributeMapNormalized boolean parking options keyed by snake_case attribute names.
deliveryboolean | nullWhether delivery is offered.
dine_inboolean | nullWhether dine-in service is offered.
takeoutboolean | nullWhether takeout is offered.
reservableboolean | nullWhether reservations are accepted.
serves_breakfastboolean | nullWhether breakfast is served.
serves_lunchboolean | nullWhether lunch is served.
serves_dinnerboolean | nullWhether dinner is served.
serves_beerboolean | nullWhether beer is served.
serves_wineboolean | nullWhether wine is served.
serves_vegetarian_foodboolean | nullWhether vegetarian food is served.
BooleanAttributeMap
{attribute_name}booleanBoolean value keyed by a snake_case accessibility, payment, or parking attribute name.
null.profile is null after that period while scores and checks persist.Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/locations/{location_id}/listings/scans/{scan_id}' \
--header 'Authorization: Bearer ceyo_platform_...'{
"scan": {
"id": "ea0c4cdd-430e-444e-8446-cbe8d47edb56",
"status": "succeeded",
"score": 82,
"grade": "good",
"result": {
"score": 82,
"grade": "good",
"summary": "The profile is healthy, with a few worthwhile improvements.",
"profile": {
"place_id": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"name": "Harbour Coffee",
"formatted_address": "12 Market Street, Dublin 2, Ireland",
"website_url": "https://harbourcoffee.example",
"national_phone_number": "01 555 0142",
"international_phone_number": "+353 1 555 0142",
"google_maps_url": "https://maps.google.com/?cid=123456789",
"business_status": "OPERATIONAL",
"primary_type": "coffee_shop",
"primary_type_display_name": "Coffee shop",
"types": ["coffee_shop", "cafe", "food"],
"rating": 4.6,
"review_count": 187,
"regular_opening_hours": {
"open_now": true,
"periods": [],
"weekday_descriptions": ["Monday: 7:30 AM – 6:00 PM"],
"special_days": [
{
"date": "2026-08-03",
"exceptional_hours": true
}
]
},
"editorial_summary": "Independent coffee shop serving seasonal drinks.",
"reviews": [],
"attributes": {
"delivery": false,
"dine_in": true,
"takeout": true
}
},
"checks": [
{
"label": "Business name",
"status": "passed",
"score": 10,
"severity": "medium",
"category": "identity_consistency",
"message": "The profile name matches the configured location.",
"recommendation": "Keep the configured and public names aligned."
},
{
"label": "Business hours",
"status": "warning",
"score": 8,
"severity": "medium",
"category": "profile_completeness",
"message": "The profile exposes only partial business hours.",
"recommendation": "Add complete regular and special hours."
}
]
},
"error_message": null,
"completed_at": "2026-07-30T09:40:03Z",
"created_at": "2026-07-30T09:39:58Z"
}
}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": "not_found",
"message": "The requested resource was not found.",
"details": null,
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
401invalid_api_keyThe API key is absent, invalid, expired, or revoked.
403forbiddenThe API key lacks listings:read or cannot access the requested location.
404not_foundThe project, location, visibility scope, or listing scan was not found.
429rate_limit_exceededToo many requests were made.
GETGet listing findings
/projects/{project_id}/locations/{location_id}/listings/findingsReturns listing findings for a location with filtering and pagination.
Get listing findings
/projects/{project_id}/locations/{location_id}/listings/findingsPath parameters
project_idproject UUID | project external IDProject identifier.
location_idlocation UUID | location external IDLocation identifier belonging to the project.
Query parameters
statusopen | resolved | ignored | allRestrict findings by lifecycle status. Use all to include every status.
severityinfo | low | medium | high | criticalRestrict findings to one severity.
categorystringRestrict findings to one category.
qstringSearch finding titles, descriptions, recommendations, and targets. Maximum: 200 characters.
pageintegerThe 1-based page number.
per_pageintegerNumber of findings per page. Maximum: 50.
Response envelope
findings:ListingFinding[]pagination:PaginationfindingsListingFinding[]Findings matching the selected filters.
paginationPaginationPagination metadata.
ListingFinding
categorystringCategory used to group related findings.
severityinfo | low | medium | high | criticalFinding importance.
statusopen | resolved | ignoredCurrent finding lifecycle status.
targetstring | nullPublic target value when available.
titlestringShort finding title.
descriptionstring | nullEvidence-backed explanation of the finding.
recommendationstring | nullRecommended response to the finding.
first_seen_atdatetimeTime the finding was first observed.
last_seen_atdatetimeTime the finding was most recently observed.
resolved_atdatetime | nullTime the finding was resolved.
created_atdatetimeTime the finding was created.
updated_atdatetimeTime the finding was most recently updated.
Pagination
pageintegerCurrent 1-based page.
per_pageintegerNumber of records requested per page.
totalintegerTotal records matching the request.
total_pagesintegerTotal available pages.
last_seen_at, with a stable identifier tie-breaker.Request and response
curl --request GET \
--url 'https://api.signal.ceyo.ai/v1/projects/{project_id}/locations/{location_id}/listings/findings?status=open&severity=medium&page=1&per_page=20' \
--header 'Authorization: Bearer ceyo_platform_...'{
"findings": [
{
"category": "profile_completeness",
"severity": "medium",
"status": "open",
"target": "ChIJN1t_tDeuEmsRUsoyG83frY4",
"title": "Business hours",
"description": "The profile exposes only partial business hours.",
"recommendation": "Add complete regular and special hours.",
"first_seen_at": "2026-07-16T09:40:03Z",
"last_seen_at": "2026-07-30T09:40:03Z",
"resolved_at": null,
"created_at": "2026-07-16T09:40:03Z",
"updated_at": "2026-07-30T09:40:03Z"
}
],
"pagination": {
"page": 1,
"per_page": 20,
"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": "invalid_filter",
"message": "status is not a valid listing finding filter.",
"details": {
"status": ["is not supported"]
},
"request_id": "req_01K1JQY1RQQ7N3C5H1K6J0P8AT"
}
}Status codes
400invalid_filterA finding filter is invalid or q is longer than 200 characters.
401invalid_api_keyThe API key is absent, invalid, expired, or revoked.
403forbiddenThe API key lacks listings:read or cannot access the requested location.
404not_foundThe project, location, or visibility scope was not found.
422validation_failedpage or per_page is outside the supported range.
429rate_limit_exceededToo many requests were made.