v1Resources/Listings Published
Listings Published
Read a location's listing sync status across directories.
Returns sync status across publishers, Google Business Profile status, and improvement opportunities for one location.
Get location's listing
get
listings:read/api/v1/listingsQuery parameters
locationIdstringrequired
The location to look up. Required. Look it up with GET /api/v1/locations.
clientIdstringoptional
The location's client. Only needed to disambiguate when your key is scoped to specific clients.
Response
dataobjectoptional
statsobjectoptional
Summary counts across all publishers for this location.
publishersnumberoptional
Total number of publishers tracked.
syncednumberoptional
Number of publishers currently in sync.
notConnectednumberoptional
Number of publishers not yet connected.
googleVerifiedLocationsnumberoptional
Number of Google-verified locations.
duplicatesnumberoptional
Number of duplicate listings detected.
connectionIssuesnumberoptional
Number of publishers with a connection issue.
requiresActionnumberoptional
Number of publishers requiring action.
publishersarray of objectoptional
Per-publisher sync status.
publisherIdstringoptional
Identifier of the directory/publisher.
publisherNamestringoptional
Display name of the publisher.
statusstring (synced | in_progress | failed | requires_action | not_connected | expired | suspended | pending_approval | inaccessible | credentials_invalidated | not_available)optional
One of: synced, in_progress, failed, requires_action, not_connected, expired, suspended, pending_approval, inaccessible, credentials_invalidated, not_available.
liveLinksnumberoptional
Number of live links found for this publisher, or null.
gbpobjectoptional
Google Business Profile summary, when connected.
connectedbooleanoptional
Whether a Google Business Profile is connected.
scorenumberoptional
Profile completeness score, 0–100, or null.
donearray of stringoptional
Completed profile improvement items.
todoarray of stringoptional
Outstanding profile improvement items.
opportunitiesarray of objectoptional
Suggested improvements, each with a short message and a tone.
textstringoptional
tonestring (amber | rose | blue | zinc)optional
aiobjectoptional
A short AI-generated headline and up to 3 prioritized fixes for this location, or null.
headlinestringoptional
One-sentence summary of this location's listing health.
fixFirstarray of objectoptional
Up to 3 suggested next actions, ranked by impact.
textstringoptional
impactstring (High | Med | Low)optional
noticestringoptional
A human-readable notice about this location's listing data, or null.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
404The resource wasn't found, or doesn't belong to your agency.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/listings
Your API key
locationId *
clientId
{
"data": {
"stats": {
"publishers": 42,
"synced": 38,
"notConnected": 2,
"googleVerifiedLocations": 1,
"duplicates": 0,
"connectionIssues": 1,
"requiresAction": 1
},
"publishers": [
{
"publisherId": "google",
"publisherName": "Google",
"status": "synced",
"liveLinks": 1
}
],
"gbp": {
"connected": true,
"score": 82,
"done": [
"Business name",
"Address"
],
"todo": [
"Add photos"
]
},
"opportunities": [
{
"text": "Add more photos to your Google profile",
"tone": "amber"
}
],
"ai": {
"headline": "90% synced — 1 listing needs action.",
"fixFirst": [
{
"text": "Reconnect 1 listing needing action.",
"impact": "High"
}
]
},
"notice": null
}
}v1Resources/Listings Published/getGet a listings summary
Publisher sync health across this client's (or the whole agency's) locations — an aggregate summary plus a per-location breakdown, insights (health %, sync distribution, weakest publishers, ranked "needs attention" items), and a deterministic headline. Scope to a subset with tags. Backed by the same rollup as the Listings → All locations view.
Get a listings summary
get
listings:read/api/v1/listings/summaryQuery parameters
clientIdstringoptional
Limit to one client's locations.
tagsstringoptional
Comma-separated location tag names — only locations carrying at least one of these are included.
pageintegeroptional
Page of the per-location rows (1-based). Default 1.
perPageintegeroptional
Rows per page (max 200). Default 50.
Response
dataobjectoptional
summaryobjectoptional
Aggregate counts across every location in scope.
locationsnumberoptional
Number of locations in scope.
publishersTotalnumberoptional
Total publisher slots across all locations in scope.
publishersSyncednumberoptional
Of those, currently synced.
connectionIssuesnumberoptional
Native connector (Google/Facebook) rows with a connection problem.
duplicatesnumberoptional
Detected duplicate listings across the scope.
reviewsnumberoptional
Total reviews across the scope.
avgRatingnumberoptional
Average rating across locations that have one.
rowsarray of objectoptional
One row per location in scope (paginated).
locationIdstringoptional
Location id.
namestringoptional
Location name.
citystringoptional
Location city.
publishersnumberoptional
Publisher slots for this location.
syncednumberoptional
Of those, currently synced.
connectionIssuesnumberoptional
Native connector rows with a connection problem.
duplicatesnumberoptional
Detected duplicate listings for this location.
reviewsnumberoptional
Total reviews for this location.
unrepliednumberoptional
Reviews awaiting a reply.
avgRatingnumberoptional
Average rating for this location.
googleVerifiedbooleanoptional
Google listing is connected and verified.
googleConnectedbooleanoptional
Google is connected (may still be awaiting verification).
tagsarray of stringoptional
This location's internal tags.
insightsobjectoptional
Derived insights computed from the rows above.
healthnumberoptional
publishersSynced / publishersTotal, as a percentage.
distributionobjectoptional
Locations bucketed by sync rate (fullySynced 100%, healthy 90-99%, atRisk <90%).
fullySyncednumberoptional
Locations at 100% sync.
healthynumberoptional
Locations at 90-99% sync.
atRisknumberoptional
Locations below 90% sync.
weakestarray of objectoptional
Lowest-coverage publishers across the scope.
idstringoptional
Publisher id.
namestringoptional
Publisher name.
totalnumberoptional
Locations carrying this publisher.
syncednumberoptional
Of those, synced.
requiresActionnumberoptional
Of those, requiring action.
notConnectednumberoptional
Of those, not connected.
pctnumberoptional
Synced percentage, rounded.
directoriesarray of objectoptional
Full per-publisher coverage table.
idstringoptional
Publisher id.
namestringoptional
Publisher name.
totalnumberoptional
Locations carrying this publisher.
syncednumberoptional
Of those, synced.
requiresActionnumberoptional
Of those, requiring action.
notConnectednumberoptional
Of those, not connected.
pctnumberoptional
Synced percentage, rounded.
attentionarray of objectoptional
Ranked "needs attention" cards.
nnumberoptional
Count this card represents.
titlestringoptional
Card title.
substringoptional
Card subtitle.
tonestring (amber | blue | rose | zinc)optional
Visual tone for this card.
filterstring (issues | duplicates | under80 | unverified | notconnected)optional
Matching locations-table filter key.
headlinestringoptional
A deterministic one-line summary of scope health.
fixFirstarray of objectoptional
Ranked priority fixes.
textstringoptional
Fix description.
impactstring (High | Med | Low)optional
Estimated impact of this fix.
filterstring (issues | duplicates | under80 | unverified | notconnected)optional
Matching locations-table filter key.
totalnumberoptional
Total matching locations (for pagination), independent of perPage.
pagenumberoptional
Current page (1-based).
perPagenumberoptional
Rows per page.
Errors
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/listings/summary
Your API key
clientId
tags
page
perPage
{
"data": {
"summary": {
"locations": 12,
"publishersTotal": 96,
"publishersSynced": 81,
"connectionIssues": 3,
"duplicates": 2,
"reviews": 340,
"avgRating": 4.6
},
"rows": [
{
"locationId": "loc_456",
"name": "Acme Dental — Downtown",
"city": "Austin",
"publishers": 8,
"synced": 7,
"connectionIssues": 0,
"duplicates": 0,
"reviews": 26,
"unreplied": 2,
"avgRating": 4.8,
"googleVerified": true,
"googleConnected": true,
"facebookConnected": true,
"tags": [
"vip"
]
}
],
"insights": {
"health": 84,
"distribution": {
"fullySynced": 9,
"healthy": 2,
"atRisk": 1
},
"weakest": [
{
"locationId": "loc_789",
"name": "Acme Dental — Eastside",
"health": 40
}
],
"directories": [
{
"id": "google",
"name": "Google Maps",
"total": 12,
"synced": 11,
"requiresAction": 0,
"notConnected": 1,
"pct": 92
}
],
"attention": [
{
"n": 1,
"title": "1 location under 90% synced",
"sub": "Listings not fully propagated",
"tone": "amber",
"filter": "under80"
}
],
"headline": "84% listing health — 1 location under 90% synced needs attention.",
"fixFirst": [
{
"text": "Reconnect 1 location's listing sync.",
"impact": "Med"
}
]
},
"total": 12,
"page": 1,
"perPage": 50
}
}get/api/v1/seo/share-of-voice
Your API key
locationId *
clientId
from
to
{
"data": {
"comparison": {
"available": true,
"rows": [
{
"name": "Acme Dental — Downtown",
"top3Pct": 62,
"isYou": true
},
{
"name": "Bright Smiles Dental",
"top3Pct": 74
}
]
},
"keywords": {
"available": true,
"rows": [
{
"keyword": "dentist near me",
"top3Pct": 62,
"avgRank": 3.2
}
]
},
"performance": {
"available": true,
"series": [
{
"keyword": "dentist near me",
"points": [
{
"yearMonth": "2026-01",
"avgRank": 3.6
},
{
"yearMonth": "2026-02",
"avgRank": 3.2
}
]
}
]
}
}
}v1Resources/Listings Published/getGet Citation Index
How many directories index this location, current vs. a prior period.
Get Citation Index
get
seo:read/api/v1/seo/citation-indexQuery parameters
locationIdstringrequired
The location to look up. Look it up with GET /api/v1/locations.
clientIdstringoptional
The location's client. Only needed to disambiguate when your key is scoped to specific clients.
fromstringoptional
Window start (ISO date). Defaults to 30 days ago.
tostringoptional
Window end (ISO date). Defaults to now.
Response
dataobjectoptional
availablebooleanoptional
Whether a citation-index snapshot exists yet for this location.
currentobjectoptional
The latest snapshot at or before the window end.
percentagenumberoptional
Percentage of listings currently indexed (0–100), or null.
listingsnumberoptional
Total live listings counted in this snapshot, or null.
indexednumberoptional
Of those, how many are indexed, or null.
previousobjectoptional
The latest snapshot at or before the window start, for comparison.
percentagenumberoptional
Percentage of listings currently indexed (0–100), or null.
listingsnumberoptional
Total live listings counted in this snapshot, or null.
indexednumberoptional
Of those, how many are indexed, or null.
Errors
400The request is missing a required parameter or is otherwise malformed.
401Missing, invalid, expired, or revoked API key.
403The key lacks the required scope, or isn't authorized for this client/location.
429Too many requests. Retry after the number of seconds in the Retry-After header.
get/api/v1/seo/citation-index
Your API key
locationId *
clientId
from
to
{
"data": {
"available": true,
"current": {
"percentage": 90.48,
"listings": 42,
"indexed": 38
},
"previous": {
"percentage": 83.33,
"listings": 42,
"indexed": 35
}
}
}