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.

Python
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]]
ParameterTypeDescription
location_idstr | intLocation to process.
templatestrReply text for matching reviews. {rating} is replaced with the review's rating.
min_ratingintOnly reply to reviews at this rating or higher. Defaults to 4.
only_unansweredboolSkip reviews that already have a response. Defaults to True.
dry_runboolReturn what would be replied to without posting. Defaults to False.

It stands in for reviews.list paged through with auto_paging_iter(), then one reviews.respond call per review that passes both filters.

Python
# 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.

Python
client.workflows.listings_health_audit(location_id: str | int) -> APIObject

It stands in for listings.premium, listings.voice, and listings.duplicates for the same location, with the premium results counted by syncStatus.

Python
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.

Python
client.workflows.weekly_reputation_report(    location_id: str | int,    *,    start_date: str | None = None,    end_date: str | None = None,) -> APIObject

start_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.

Python
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