Google Business Profile

Reviews of your customers' business locations, and the owner's replies, through your Google Cloud project with the single business.manage scope.

The permissions each capability needs are in App Review: Google Business Profile.

  • One Connected Profile is one location, so connecting a grant once discovers every location under every account it administers — a chain connects all its shops from one Connection.
  • Reviews are read-only: Google exposes no method that creates, edits, hides, deletes, or flags a review, so replying is the only owner action.
  • A reply has no id of its own — it is addressed by the id of the review it answers — so publishing one again replaces it and there is no separate update; text is bounded at 4,096 **bytes** as UTF-8, not characters.
  • Google moderates every reply: a successful publish returns PENDING and becomes APPROVED or REJECTED afterwards. Read the review to see the current state.
  • Reviews are listed most recently changed first, so a review the reviewer edits arrives again as an updated event. A review deleted on Google simply stops being listed: no event is emitted for it.
  • Google publishes review notifications to a Cloud Pub/Sub topic rather than an HTTP callback, so reviews are collected by polling at a fifteen-minute floor and there is no webhook URL to configure.
  • A review carries rating as whole stars on a 1–5 scale (with percent, which compares across providers) and omits it when Google reports none; reviewer carries a display name and photo, or neither for an anonymous reviewer, because Google publishes no stable reviewer id.

Your Google Cloud project must be approved before it can make a single call

An unapproved project is capped at zero queries per minute. Approval requires a Business Profile verified and active for 60+ days, a website, and an application filed by an owner or manager on the profile. Replying additionally requires the location to be verified and, in a Workspace tenant, Google Search and/or Maps enabled by the admin.
Content typeOperationsEventsBackfill
google_business_profile.locations.reviewslist, getcreated, updatedno
google_business_profile.locations.review_repliesget, publish, deletenoneno

google_business_profile.locations.reviews

list

List the location's reviews, most recently changed first.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
cursorstringnoOpaque cursor for fetching the next result page.
limitnumbernoMaximum number of items to return.
includeProviderRawbooleannoWhether to include transient provider-native payloads.
JSON Schema
{
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "connectedProfileId": {
      "description": "Koil Connected Profile associated with the operation.",
      "minLength": 1,
      "type": "string"
    },
    "cursor": {
      "description": "Opaque cursor for fetching the next result page.",
      "minLength": 1,
      "type": "string"
    },
    "limit": {
      "description": "Maximum number of items to return.",
      "minimum": 1,
      "type": "number"
    },
    "includeProviderRaw": {
      "description": "Whether to include transient provider-native payloads.",
      "type": "boolean"
    }
  },
  "required": [
    "connectedProfileId"
  ]
}

get

Get one review of the location by provider id.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyes
includeProviderRawbooleannoWhether to include transient provider-native payloads.
JSON Schema
{
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "connectedProfileId": {
      "description": "Koil Connected Profile associated with the operation.",
      "minLength": 1,
      "type": "string"
    },
    "externalId": {
      "minLength": 1,
      "type": "string"
    },
    "includeProviderRaw": {
      "description": "Whether to include transient provider-native payloads.",
      "type": "boolean"
    }
  },
  "required": [
    "connectedProfileId",
    "externalId"
  ]
}

Not offered

  • publish: not applicable — A review is written by a customer on Google, never by the business.
  • update: provider not supported — Google exposes no method that edits a review.
  • moderate: provider not supported — Google exposes no hide, spam, or report method on a review. Replying is the only owner action, on google_business_profile.locations.review_replies.
  • delete: provider not supported — Google exposes no method that deletes a review; flagging one for a policy violation is a Business Profile UI action with no API.

Events

Backfill: not offered — not implemented.

Item schema

What list and get return and what events carry as data.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
locationExternalIdstringyes
ratingobjectnoA score on the provider's own scale, with its position on that scale as a percentage.
textstringnoCaption/body text for content.
reviewerobjectyesThe reviewer as Google reports them: a name and photo, or neither when anonymous. Google publishes no stable reviewer id.
mediaobject[]no
replyobjectno
publishedAtstring (date-time)noProvider publish timestamp as an ISO-8601 string.
updatedAtstring (date-time)noProvider update timestamp as an ISO-8601 string.
providerRawunknownnoOptional provider-native payload included only for transient delivery/debug use.
contentType"google_business_profile.locations.reviews"yes

google_business_profile.locations.review_replies

get

Get the owner's reply to one review.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyesThe review's id; a reply has no id of its own.
includeProviderRawbooleannoWhether to include transient provider-native payloads.
JSON Schema
{
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "connectedProfileId": {
      "description": "Koil Connected Profile associated with the operation.",
      "minLength": 1,
      "type": "string"
    },
    "externalId": {
      "minLength": 1,
      "description": "The review's id; a reply has no id of its own.",
      "type": "string"
    },
    "includeProviderRaw": {
      "description": "Whether to include transient provider-native payloads.",
      "type": "boolean"
    }
  },
  "required": [
    "connectedProfileId",
    "externalId"
  ]
}

publish

Write the owner's reply to a review, replacing any existing reply. Google moderates it before it appears.

Submit through POST /v1/publish-requests with contentType: "google_business_profile.locations.review_replies". These fields go in the item's args; connectedProfileId and variant are item fields.

FieldTypeRequiredDescription
targetobjectyesThe provider content this publish targets, identified as events identify it.
textstringyesThe reply, at most 4096 bytes as UTF-8. Google moderates it: a successful publish is accepted, not yet visible.
JSON Schema
{
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "target": {
      "additionalProperties": false,
      "description": "The provider content this publish targets, identified as events identify it.",
      "type": "object",
      "properties": {
        "contentType": {
          "const": "google_business_profile.locations.reviews",
          "type": "string"
        },
        "externalId": {
          "description": "Provider-owned content identifier.",
          "minLength": 1,
          "type": "string"
        }
      },
      "required": [
        "contentType",
        "externalId"
      ]
    },
    "text": {
      "minLength": 1,
      "maxLength": 4096,
      "description": "The reply, at most 4096 bytes as UTF-8. Google moderates it: a successful publish is accepted, not yet visible.",
      "type": "string"
    }
  },
  "required": [
    "target",
    "text"
  ]
}

delete

Remove the owner's reply to a review.

FieldTypeRequiredDescription
connectedProfileIdstringyesKoil Connected Profile associated with the operation.
externalIdstringyesThe review whose reply to remove.
JSON Schema
{
  "additionalProperties": false,
  "type": "object",
  "properties": {
    "connectedProfileId": {
      "description": "Koil Connected Profile associated with the operation.",
      "minLength": 1,
      "type": "string"
    },
    "externalId": {
      "minLength": 1,
      "description": "The review whose reply to remove.",
      "type": "string"
    }
  },
  "required": [
    "connectedProfileId",
    "externalId"
  ]
}

Not offered

  • list: provider no endpoint — Google exposes no listing of replies; each appears on the review it answers.
  • update: not applicable — Publishing again for the same review replaces the reply; Google keeps one per review.
  • moderate: not applicable — Google moderates the owner's reply, not Koil.

Events

None: this content type is read-only.

Backfill: not offered — not implemented.

Item schema

What list and get return and what events carry as data.

FieldTypeRequiredDescription
externalIdstringyesProvider-owned content identifier.
locationExternalIdstringyes
textstringyesCaption/body text for content.
state"PENDING" | "APPROVED" | "REJECTED"noGoogle's moderation state of the owner's reply.
policyViolationstringno
updatedAtstring (date-time)noProvider update timestamp as an ISO-8601 string.
providerRawunknownnoOptional provider-native payload included only for transient delivery/debug use.
contentType"google_business_profile.locations.review_replies"yes

On this page