Publish a reply on Google
Publish from your tool the reply to a Google review, for the locations that allowed it, with the same checks as in the app.
API documentationGuides · Google publishing
What the operation does
POST /v1/reviews/{reviewId}/reply publishes a reply to a review on the location's Google profile, through the same path as a publication made in the app, then returns the answered review. It is in beta.
Publishing goes through the Google Business Profile connection that the location authorized in Ma Belle Note. Ma Belle Note is not affiliated with Google, and this feature is not part of any partnership with Google. The Google API disclosure page describes how we use that connection. No other action on Google, such as editing the profile, photos or posts, is possible through the API.
Three conditions
- The
replies:publishscope on the key, shown in the app as “Publish replies on Google”. - The location's authorization. It is off by default and can only be turned on in the app, location by location: Settings › Integration, API & webhooks, Google publishing tab. Only owners and admins can grant or withdraw it. It is timestamped, and withdrawing it applies from the next call. The
apiReplyPublishing.enabledfield ofGET /v1/establishmentsshows its state. - The
Idempotency-Keyheader, required: a replayed call never publishes twice. Without it, the API answers400 invalid_request.
The scope alone is not enough: a key holding replies:publish receives 403 google_publishing_not_authorized for any location that has not given its authorization.
Publish a reply
curl https://api.mabellenote.com/v1/reviews/jd7f3k2m9x8w1q4z6c5v3b2n1m0l9k8j/reply \
-H "Authorization: Bearer $MBN_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: reply-jd7f3k2m9x8w1q4z6c5v3b2n1m0l9k8j" \
-d '{ "content": "Hello Jean, thank you for your feedback. We have talked it over with the evening team." }'
| Field | Role |
|---|---|
content | Text of the reply, not empty. |
acknowledgedSensitivity | true to confirm the publication of a reply deemed sensitive. false by default. |
The response is the review (Review), with its reply in reply. The publication also produces a review.reply_published event with the api origin, delivered to your webhooks.
The same checks as the app
- Sensitive reply: when the review or the reply is deemed sensitive, publishing is refused with
422 unprocessableuntilacknowledgedSensitivityistrue. Have a person read the reply before confirming. - Pace of writes to Google: the writes to Google of a location are limited, whatever their channel. Beyond that, the API answers
429 rate_limitedwithRetry-After. - Review already answered: a review that already has a reply published by Ma Belle Note answers
409 conflict. - Traceability: every publication stays visible in the app, like any reply.
When publishing is switched off
Publishing through the API can be suspended for every account, without affecting the rest of the API. It then answers 503 google_publishing_disabled, and nothing is published. Reads, drafts and webhooks keep working.
Plan for this case in your integration: drop the reply as a draft with PUT /v1/reviews/{reviewId}/reply-draft (replies:write scope), so that it is published from the app, or try again later with the same Idempotency-Key.
Errors to handle
| Response | Cause | What to do |
|---|---|---|
400 invalid_request | Idempotency-Key missing, or content empty | Fix the request. |
403 insufficient_scope | The key does not hold replies:publish | Create a key with this scope. |
403 google_publishing_not_authorized | The location has not allowed publishing through the API | Ask an owner to turn it on in the app. |
403 tenant_read_only | The account is read-only | Restore the subscription. |
404 not_found | Unknown review, or one from another account | Check the identifier. |
409 conflict | The review already has a reply published by Ma Belle Note | Do nothing, or read the review again. |
422 unprocessable | Sensitive reply not confirmed | Have it read, then send it again with acknowledgedSensitivity. |
429 rate_limited | Key rate, or pace of Google writes reached | Wait for Retry-After, then send again with the same key. |
503 google_publishing_disabled | Publishing through the API suspended for every account | Drop a draft, or try again later. |
The errors guide describes the common format of these responses.
Updated on October 25, 2026

