Listings API

Listing Visibility API

Use the Listing Visibility API to find a business listing, start a visibility scan, check status, and read a report that covers listing confidence, search presence, AI readiness, competitors, citations, and recommended next steps.

Give these docs to your AI agent

Copy or download a clean markdown version of the Listing Visibility API docs.

You are viewing the Listing Visibility API docs. For the main Ceyo platform API, see Main Ceyo Platform API. To try the public tool, see AI-Ready Business Listing.
Separate API surface. These endpoints use Listing Visibility API keys and live under /api/listings/v1.

Quick start

The base URL is:

https://api.ceyo.ai/api/listings/v1
  1. Create a Listing Visibility API key in Ceyo and use it for every request.

  2. Search for a business listing with places autocomplete and keep the returned place_id.

  3. Create a scan with that place_id.

  4. Poll the scan until status is succeeded or failed, then read scan.overall_score and scan.result.

Minimal flow

curl "https://api.ceyo.ai/api/listings/v1/places/autocomplete?q=Black%20Olive%20Amsterdam" \
  -H "X-Api-Key: ceyo_lva_..."

curl -X POST "https://api.ceyo.ai/api/listings/v1/visibility_scans" \
  -H "X-Api-Key: ceyo_lva_..." \
  -H "Content-Type: application/json" \
  -d '{"place_id":"ChIJ..."}'

curl "https://api.ceyo.ai/api/listings/v1/visibility_scans/123" \
  -H "X-Api-Key: ceyo_lva_..."

Authentication

Every request must include a Listing Visibility API key. Send the key in the X-Api-Key header.

HeaderExample
X-Api-KeyX-Api-Key: ceyo_lva_...
Use server-side only. Listing Visibility API keys should stay on your server. Use publishable widget keys for the embeddable browser widget.

Scan lifecycle

StatusMeaning
pendingScan row was created and background work is queued.
runningCeyo is collecting listing, search, citation, competitor, and AI visibility signals.
succeededThe report is complete. Read scan.overall_score and scan.result.
failedThe scan could not be completed. Check scan.error_code when present.

Most integrations create a scan, check GET /visibility_scans/:id until the scan reaches a terminal status, then read scan.overall_score and the report sections. Scans stuck in pending or running are automatically marked failed after the server timeout window.


Errors

Errors return JSON with an error message. Service-level validation errors include errors.error_code; auth/gate errors may return top-level error_code.

{
  "error": "place_id is required",
  "errors": {
    "error_code": "place_id_required"
  }
}
Error codeMeaning
billing_inactiveBilling is inactive for the workspace.
place_id_requiredA scan create request did not include place_id.
invalid_place_idThe supplied place_id could not be resolved to a business listing.
monthly_listing_visibility_scans_limit_reachedThe monthly scan allowance has been reached.
rate_limitedToo many requests. Check Retry-After before trying again.
not_foundThe requested scan does not exist in this workspace.
email_invalidLead capture email is not valid.

Endpoints

GET/places/autocomplete

Search for business listings and return place candidates. Use the returned place_id to create a scan.

Query parameters

NameTypeRequiredDescription
qstringYesSearch query. Must be at least 2 characters.
limitintegerNoMaximum candidates to return. Defaults to 5, maximum 10.

Example request

curl "https://api.ceyo.ai/api/listings/v1/places/autocomplete?q=Black%20Olive%20Amsterdam&limit=5" \
  -H "X-Api-Key: ceyo_lva_..."
Response fields
FieldTypeDescription
places[]object[]Matching business listing candidates.
places[].place_idstringStable listing identifier. Pass this to scan creation as place_id.
places[].namestringBusiness or place display name.
places[].formatted_addressstring | nullFormatted address when available.
places[].primary_type_display_namestring | nullHuman-readable place category.
places[].ratingnumber | nullListing rating when available.
places[].review_countinteger | nullListing review count when available.
places[].typesstring[] | nullListing category/type tags when available.
POST/visibility_scans

Create a Listing Visibility scan from a place_id. The response omits the full result while background work starts.

Body parameters

NameTypeRequiredDescription
place_idstringYesListing identifier from places autocomplete.

Example request

curl -X POST "https://api.ceyo.ai/api/listings/v1/visibility_scans" \
  -H "X-Api-Key: ceyo_lva_..." \
  -H "Content-Type: application/json" \
  -d '{"place_id":"ChIJ..."}'
Response fields
FieldTypeDescription
scan.idintegerListing Visibility scan ID.
scan.place_idstringListing identifier used for this scan.
scan.namestringResolved business name.
scan.addressstringResolved business address.
scan.website_urlstring | nullResolved website URL when available.
scan.statusstringOne of pending, running, succeeded, or failed.
scan.overall_scoreinteger | nullWeighted overall Listing Visibility score from 0 to 100. This is the same score shown in the embeddable widget and internal workspace UI.
scan.progress.currentinteger | nullNumber of completed progress steps.
scan.progress.totalinteger | nullTotal progress steps for the scan.
scan.progress.labelstring | nullHuman-readable progress label.
scan.completed_checksstring[]Completed scan modules.
scan.queued_checksstring[]Scan modules queued for this workspace.
scan.lead_emailstring | nullCaptured lead email when submitted through the lead endpoint.
scan.lead_captured_atstring | nullLead capture timestamp.
scan.started_atstring | nullScan start timestamp.
scan.finished_atstring | nullScan completion timestamp.
scan.created_atstringCreation timestamp.
scan.updated_atstringLast update timestamp.
GET/visibility_scans

List scans for the authenticated Listing Visibility workspace. Results are returned newest first and include result data.

Query parameters

NameTypeRequiredDescription
pageintegerNoPage number. Defaults to 1.
per_pageintegerNoItems per page. Defaults to 50, maximum 50.
statusstringNoFilter by pending, running, succeeded, or failed.
fromstringNoInclusive created_at lower bound. Any parseable ISO timestamp is accepted.
tostringNoInclusive created_at upper bound. Any parseable ISO timestamp is accepted.

Example request

curl "https://api.ceyo.ai/api/listings/v1/visibility_scans?status=succeeded&page=1&per_page=25" \
  -H "X-Api-Key: ceyo_lva_..."
Response fields
FieldTypeDescription
scansobject[]Paginated scans.
pagination.pageintegerCurrent page.
pagination.per_pageintegerItems per page.
pagination.totalintegerTotal matching scans.
pagination.total_pagesintegerTotal pages.
FieldTypeDescription
scans[].idintegerListing Visibility scan ID.
scans[].place_idstringListing identifier used for this scan.
scans[].namestringResolved business name.
scans[].addressstringResolved business address.
scans[].website_urlstring | nullResolved website URL when available.
scans[].statusstringOne of pending, running, succeeded, or failed.
scans[].overall_scoreinteger | nullWeighted overall Listing Visibility score from 0 to 100. This is the same score shown in the embeddable widget and internal workspace UI.
scans[].progress.currentinteger | nullNumber of completed progress steps.
scans[].progress.totalinteger | nullTotal progress steps for the scan.
scans[].progress.labelstring | nullHuman-readable progress label.
scans[].completed_checksstring[]Completed scan modules.
scans[].queued_checksstring[]Scan modules queued for this workspace.
scans[].lead_emailstring | nullCaptured lead email when submitted through the lead endpoint.
scans[].lead_captured_atstring | nullLead capture timestamp.
scans[].started_atstring | nullScan start timestamp.
scans[].finished_atstring | nullScan completion timestamp.
scans[].created_atstringCreation timestamp.
scans[].updated_atstringLast update timestamp.
scans[].resultobjectIncluded on list/show responses. Omitted from create responses. Contains report sections such as business_identity_confidence, ai_visibility_readiness, search_presence_check, competitor_snapshot, and quick_recommended_actions.
GET/visibility_scans/:id

Fetch one scan by ID. Use this endpoint to retrieve scan status and the final report.

Path parameters

NameTypeRequiredDescription
idintegerYesListing Visibility scan ID.

Example request

curl "https://api.ceyo.ai/api/listings/v1/visibility_scans/123" \
  -H "X-Api-Key: ceyo_lva_..."
Response fields
FieldTypeDescription
scan.idintegerListing Visibility scan ID.
scan.place_idstringListing identifier used for this scan.
scan.namestringResolved business name.
scan.addressstringResolved business address.
scan.website_urlstring | nullResolved website URL when available.
scan.statusstringOne of pending, running, succeeded, or failed.
scan.overall_scoreinteger | nullWeighted overall Listing Visibility score from 0 to 100. This is the same score shown in the embeddable widget and internal workspace UI.
scan.progress.currentinteger | nullNumber of completed progress steps.
scan.progress.totalinteger | nullTotal progress steps for the scan.
scan.progress.labelstring | nullHuman-readable progress label.
scan.completed_checksstring[]Completed scan modules.
scan.queued_checksstring[]Scan modules queued for this workspace.
scan.lead_emailstring | nullCaptured lead email when submitted through the lead endpoint.
scan.lead_captured_atstring | nullLead capture timestamp.
scan.started_atstring | nullScan start timestamp.
scan.finished_atstring | nullScan completion timestamp.
scan.created_atstringCreation timestamp.
scan.updated_atstringLast update timestamp.
scan.resultobjectIncluded on list/show responses. Omitted from create responses. Contains report sections such as business_identity_confidence, ai_visibility_readiness, search_presence_check, competitor_snapshot, and quick_recommended_actions.
PATCH/visibility_scans/:id/lead

Attach a lead email to a scan. This is optional for public API integrations; it exists so API customers can store lead capture alongside scan records when useful.

Path parameters

NameTypeRequiredDescription
idintegerYesListing Visibility scan ID.

Body parameters

NameTypeRequiredDescription
emailstringYesLead email address.

Example request

curl -X PATCH "https://api.ceyo.ai/api/listings/v1/visibility_scans/123/lead" \
  -H "X-Api-Key: ceyo_lva_..." \
  -H "Content-Type: application/json" \
  -d '{"email":"founder@example.com"}'
Response fields
FieldTypeDescription
scan.idintegerListing Visibility scan ID.
scan.place_idstringListing identifier used for this scan.
scan.namestringResolved business name.
scan.addressstringResolved business address.
scan.website_urlstring | nullResolved website URL when available.
scan.statusstringOne of pending, running, succeeded, or failed.
scan.overall_scoreinteger | nullWeighted overall Listing Visibility score from 0 to 100. This is the same score shown in the embeddable widget and internal workspace UI.
scan.progress.currentinteger | nullNumber of completed progress steps.
scan.progress.totalinteger | nullTotal progress steps for the scan.
scan.progress.labelstring | nullHuman-readable progress label.
scan.completed_checksstring[]Completed scan modules.
scan.queued_checksstring[]Scan modules queued for this workspace.
scan.lead_emailstring | nullCaptured lead email when submitted through the lead endpoint.
scan.lead_captured_atstring | nullLead capture timestamp.
scan.started_atstring | nullScan start timestamp.
scan.finished_atstring | nullScan completion timestamp.
scan.created_atstringCreation timestamp.
scan.updated_atstringLast update timestamp.
scan.resultobjectIncluded on list/show responses. Omitted from create responses. Contains report sections such as business_identity_confidence, ai_visibility_readiness, search_presence_check, competitor_snapshot, and quick_recommended_actions.

Scan object

FieldTypeDescription
scan.idintegerListing Visibility scan ID.
scan.place_idstringListing identifier used for this scan.
scan.namestringResolved business name.
scan.addressstringResolved business address.
scan.website_urlstring | nullResolved website URL when available.
scan.statusstringOne of pending, running, succeeded, or failed.
scan.overall_scoreinteger | nullWeighted overall Listing Visibility score from 0 to 100. This is the same score shown in the embeddable widget and internal workspace UI.
scan.progress.currentinteger | nullNumber of completed progress steps.
scan.progress.totalinteger | nullTotal progress steps for the scan.
scan.progress.labelstring | nullHuman-readable progress label.
scan.completed_checksstring[]Completed scan modules.
scan.queued_checksstring[]Scan modules queued for this workspace.
scan.lead_emailstring | nullCaptured lead email when submitted through the lead endpoint.
scan.lead_captured_atstring | nullLead capture timestamp.
scan.started_atstring | nullScan start timestamp.
scan.finished_atstring | nullScan completion timestamp.
scan.created_atstringCreation timestamp.
scan.updated_atstringLast update timestamp.
scan.resultobjectIncluded on list/show responses. Omitted from create responses. Contains report sections such as business_identity_confidence, ai_visibility_readiness, search_presence_check, competitor_snapshot, and quick_recommended_actions.

Result sections

scan.result is an object keyed by section. Sections may be absent when a check is not enabled or could not complete.

business_identity_confidence

Business identity, listing details, and consistency signals.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
checks[]object[]Individual checks.
checks[].keystringCheck identifier.
checks[].labelstringHuman-readable check label.
checks[].statusstringCheck status.
checks[].scorenumber | nullCheck score when available.
checks[].max_scorenumber | nullMaximum check score when available.
checks[].messagestring | nullCheck explanation.
strengths[]object[]Positive findings.
strengths[].keystringStrength identifier.
strengths[].messagestringStrength explanation.
issues[]object[]Issues found in the section.
issues[].keystringIssue identifier.
issues[].severitystringIssue severity.
issues[].messagestringIssue explanation.
placeobjectResolved listing details.
place.place_idstringListing identifier.
place.namestringBusiness name.
place.addressstring | nullBusiness address.
place.website_urlstring | nullBusiness website.
place.phonestring | nullBusiness phone.
place.primary_type_display_namestring | nullPrimary listing category.
place.ratingnumber | nullListing rating.
place.review_countinteger | nullListing review count.
place.photo_countinteger | nullNumber of listing photos found.
listing_visibility_audit

Listing completeness, review strength, photo coverage, and listing quality checks.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
checks[]object[]Individual checks.
checks[].keystringCheck identifier.
checks[].labelstringHuman-readable check label.
checks[].statusstringCheck status.
checks[].scorenumber | nullCheck score when available.
checks[].max_scorenumber | nullMaximum check score when available.
checks[].messagestring | nullCheck explanation.
strengths[]object[]Positive findings.
strengths[].keystringStrength identifier.
strengths[].messagestringStrength explanation.
issues[]object[]Issues found in the section.
issues[].keystringIssue identifier.
issues[].severitystringIssue severity.
issues[].messagestringIssue explanation.
ai_visibility_readiness

Signals that help answer engines understand, trust, and cite the business.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
checks[]object[]Individual checks.
checks[].keystringCheck identifier.
checks[].labelstringHuman-readable check label.
checks[].statusstringCheck status.
checks[].scorenumber | nullCheck score when available.
checks[].max_scorenumber | nullMaximum check score when available.
checks[].messagestring | nullCheck explanation.
strengths[]object[]Positive findings.
strengths[].keystringStrength identifier.
strengths[].messagestringStrength explanation.
issues[]object[]Issues found in the section.
issues[].keystringIssue identifier.
issues[].severitystringIssue severity.
issues[].messagestringIssue explanation.
search_presence_check

Queries and source results used to understand how the business appears in search.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
queries[]object[]Search checks run for the business.
queries[].querystringSearch query text.
queries[].official_site_foundboolean | nullWhether the official site was found.
queries[].official_site_positioninteger | nullOfficial site position when found.
queries[].brand_result_foundboolean | nullWhether a branded result was found.
queries[].brand_result_positioninteger | nullBranded result position when found.
queries[].top_sources[]object[]Top sources found for the query.
queries[].top_sources[].positioninteger | nullSource position.
queries[].top_sources[].titlestring | nullSource title.
queries[].top_sources[].domainstring | nullSource domain.
queries[].top_sources[].urlstring | nullSource URL.
citation_source_footprint

Source and citation coverage connected to the business.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
sources[]object[]Sources checked for the business.
sources[].typestring | nullSource category.
sources[].labelstring | nullSource label.
sources[].foundboolean | nullWhether the source was found.
sources[].urlstring | nullSource URL.
sources[].domainstring | nullSource domain.
quick_homepage_audit

Homepage availability and business-signal checks.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
urlstring | nullSubmitted or resolved website URL.
final_urlstring | nullFinal URL after redirects.
http_statusinteger | nullHTTP status when available.
checks[]object[]Individual homepage checks.
checks[].keystringCheck identifier.
checks[].labelstringHuman-readable check label.
checks[].statusstringCheck status.
checks[].scorenumber | nullCheck score when available.
checks[].max_scorenumber | nullMaximum check score when available.
checks[].messagestring | nullCheck explanation.
strengths[]object[]Positive findings.
strengths[].keystringStrength identifier.
strengths[].messagestringStrength explanation.
issues[]object[]Issues found in the section.
issues[].keystringIssue identifier.
issues[].severitystringIssue severity.
issues[].messagestringIssue explanation.
competitor_snapshot

Nearby competitor signals and comparison metrics.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
competitors[]object[]Competitor listings returned for comparison.
competitors[].place_idstring | nullCompetitor listing identifier.
competitors[].namestring | nullCompetitor name.
competitors[].addressstring | nullCompetitor address.
competitors[].website_urlstring | nullCompetitor website.
competitors[].primary_type_display_namestring | nullCompetitor category.
competitors[].ratingnumber | nullCompetitor rating.
competitors[].review_countinteger | nullCompetitor review count.
competitors[].photo_countinteger | nullCompetitor photo count.
competitors[].completeness_scorenumber | nullListing completeness score.
competitors[].same_categoryboolean | nullWhether the competitor is in the same category.
comparison.subject.ratingnumber | nullSubject business rating.
comparison.subject.review_countinteger | nullSubject business review count.
comparison.subject.completeness_scorenumber | nullSubject business completeness score.
comparison.competitor_medians.ratingnumber | nullMedian competitor rating.
comparison.competitor_medians.review_countinteger | nullMedian competitor review count.
comparison.competitor_medians.completeness_scorenumber | nullMedian competitor completeness score.
quick_ai_visibility_probe

Example answer-engine prompts and whether the business was mentioned or cited.

FieldTypeDescription
scorenumberSection score from 0 to 100.
gradestringLetter-style grade for the section.
summarystringShort section summary.
prompts[]object[]Prompt checks.
prompts[].promptstringPrompt text.
prompts[].answer_previewstring | nullShort answer preview.
prompts[].business_mentionedboolean | nullWhether the business was mentioned.
prompts[].mention_positioninteger | nullMention position when available.
prompts[].official_citation_foundboolean | nullWhether an official citation was found.
prompts[].official_citation.titlestring | nullOfficial citation title.
prompts[].official_citation.urlstring | nullOfficial citation URL.
prompts[].official_citation.domainstring | nullOfficial citation domain.
prompts[].citations[]object[]Citations returned for the prompt.
prompts[].citations[].titlestring | nullCitation title.
prompts[].citations[].urlstring | nullCitation URL.
prompts[].citations[].domainstring | nullCitation domain.
prompts[].fan_out_queriesstring[] | nullRelated queries used for the prompt.
quick_recommended_actions

Prioritized actions for improving the business listing and related web presence.

FieldTypeDescription
summarystringShort summary of the recommendations.
actions[]object[]Recommended actions.
actions[].idstring | integerAction identifier.
actions[].prioritystring | integerAction priority.
actions[].categorystringAction category.
actions[].titlestringAction title.
actions[].whystring | nullWhy the action matters.
actions[].how_to_fixstring | nullHow to address it.