Workflows
Composite helpers that run several SDK calls and return one combined result, via client.workflows.
All workflow methods live under client.workflows. Each one stands in for a
sequence of ordinary SDK calls you would otherwise write yourself, and returns
one combined result assembled on the client. There is no single REST endpoint
behind a workflow, so the keys on the result are the SDK's own names, not wire
field names from a response envelope.
Because a workflow makes several calls, the API key it runs under needs access
to every resource the workflow touches, and one workflow call counts against
your rate limit once per underlying request. Methods take a location_id,
which accepts numeric or base64-encoded IDs, see
Location IDs.
workflows.auto_reply_to_reviews
Reply to a location's reviews from a template, in one call. Use it to keep response rates up on positive reviews while you handle the rest by hand.
client.workflows.auto_reply_to_reviews( location_id: str | int, *, template: str = "Thank you for your feedback!", min_rating: int = 4, only_unanswered: bool = True, dry_run: bool = False,) -> list[dict[str, Any]]It stands in for reviews.list
paged through with auto_paging_iter(), then one
reviews.respond call per
review that passes both filters.
# See what would be sent, without postingplan = client.workflows.auto_reply_to_reviews( 16808, template="Thanks for the {rating}-star review!", min_rating=4, dry_run=True,)for entry in plan: print(entry["id"], entry["rating"], entry["status"]) # Then post for realresults = client.workflows.auto_reply_to_reviews(16808, min_rating=4)print(f"Replied to {len(results)} reviews")Returns a plain list of dicts, one per review it acted on, each with id,
rating, reply, and status. Run it with dry_run=True first: the entries
come back with status set to dry_run so you can check the selection before
any reply is posted.
workflows.listings_health_audit
Pull a location's listings picture in one call: premium listings, voice listings, duplicates, and a score. Use it for a per-location health panel instead of three separate calls.
client.workflows.listings_health_audit(location_id: str | int) -> APIObjectIt stands in for
listings.premium,
listings.voice, and
listings.duplicates for
the same location, with the premium results counted by syncStatus.
audit = client.workflows.listings_health_audit(16808)print(f"Health score: {audit.health_score}%")print(f"Synced: {audit.synced_count} of {len(audit.premium)}")print(f"Duplicates found: {len(audit.duplicates)}")for issue in audit.issues: print(issue.get("site"), issue.get("syncStatus"))Returns an APIObject with location_id, premium, voice, duplicates,
synced_count, issue_count, issues, and health_score. health_score is
the share of premium listings whose syncStatus is SYNCED, as a whole number
percent, and 0 when there are no premium listings. issues holds the premium
listings whose syncStatus is neither SYNCED nor absent.
workflows.weekly_reputation_report
Pull reviews, review analytics, profile analytics, and listing sync state for one location over a date window. Use it for a recurring report rather than a live dashboard, since it makes five calls.
client.workflows.weekly_reputation_report( location_id: str | int, *, start_date: str | None = None, end_date: str | None = None,) -> APIObjectstart_date and end_date are YYYY-MM-DD strings, and both are optional.
It stands in for
reviews.analytics.overview,
reviews.list with first=50,
analytics.google,
analytics.bing, and
listings.premium, with the
date window passed through to each call that accepts one.
report = client.workflows.weekly_reputation_report( 16808, start_date="2026-09-01", end_date="2026-09-07",)print(report.review_summary.get("averageRating"))print(report.analytics.get("google", {}).get("views"))print(report.listings_health.get("sync_rate"))Returns an APIObject with location_id, review_summary (the review
analytics overview), recent_reviews (up to 50 reviews in the window),
analytics (a dict with google and bing), and listings_health (a dict
with total, synced, and sync_rate). sync_rate is a formatted percent
string, and is N/A when the location has no premium listings.
See also
- Reviews: the list, respond, and analytics calls these workflows make
- Listings: premium, voice, and duplicate calls
- Analytics: Google and Bing profile metrics
- Respond to reviews: reply rules and per-site limits
- Review analytics: what the overview and timeline numbers mean
- Find and fix listing errors: what to do with the
issueslist