REST endpoints for reviews in ServFlo: 11 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication ); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id .
Operation Endpoint Risk Reviews overview GET /organizations/{organizationId}/reviewsreadList reviews GET /organizations/{organizationId}/reviews/itemsreadA review GET /organizations/{organizationId}/reviews/items/{reviewId}readSync reviews now POST /organizations/{organizationId}/reviews/syncwriteFollow a location's reviews PATCH /organizations/{organizationId}/reviews/locations/{reviewLocationId}writeDraft a reply POST /organizations/{organizationId}/reviews/items/{reviewId}/draft-replywriteReply to a review POST /organizations/{organizationId}/reviews/items/{reviewId}/replysensitiveRemove a reply DELETE /organizations/{organizationId}/reviews/items/{reviewId}/replysensitiveStart connecting Google POST /organizations/{organizationId}/reviews/google/connectsensitiveDisconnect Google POST /organizations/{organizationId}/reviews/google/disconnectsensitiveCustomer feedback GET /organizations/{organizationId}/feedbackread
GET /organizations/{organizationId}/reviews
Whether Google is connected, the Business Profile locations (and which are followed), and the rating summary: count, average, 1–5 star distribution, unanswered and last 30 days. Read-only.
Permission reviews.read (Owner, Admin, Dispatcher, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool reviews_overview (toolset marketing)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description googleobject google.modeenum unconfigured: this server has no Google OAuth client. One of live, fake, unconfigured. google.connectedboolean google.statusstring google.accountstring or null The Google account the Business Profile is managed with. google.connectedAtstring (date-time) or null google.lastSyncAtstring (date-time) or null google.lastErrorstring or null locationsarray of object locations[].idstring locations[].titlestring locations[].addressstring locations[].reviewUrlstring or null Where customers write a review of this location. locations[].selectedboolean Reviews are followed for selected locations. locations[].lastSyncedAtstring (date-time) or null locations[].lastErrorstring or null summaryobject summary.countinteger summary.averagenumber or null summary.distributionarray of integer Counts of 1, 2, 3, 4 and 5-star reviews. summary.unansweredinteger summary.last30Daysinteger
GET /organizations/{organizationId}/reviews/items
Google reviews of the followed locations, newest first, filtered by rating, unanswered (no reply yet) or location; paged by limit/offset with a total. Each carries the matched customer when a reviewer's name matched one. Read-only.
Permission reviews.read (Owner, Admin, Dispatcher, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool reviews_list (toolset marketing)
Name In Type Required Description ratingquery integer No 1–5. unansweredquery boolean No reviewLocationIdquery string No limitquery integer No 1–100. offsetquery integer No 0–100000.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/items" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description itemsarray of object items[].idstring items[].reviewerNamestring items[].reviewerPhotoUrlstring or null items[].ratinginteger 1–5 stars (0 when Google gave none). items[].commentstring items[].postedAtstring (date-time) items[].editedAtstring (date-time) items[].replystring or null The business's public reply, when there is one. items[].repliedAtstring (date-time) or null items[].customerIdstring or null items[].customerobject or null items[].customer.idstring items[].customer.namestring items[].locationobject items[].location.idstring items[].location.titlestring totalinteger
GET /organizations/{organizationId}/reviews/items/{reviewId}
One Google review with the business's reply and the matched customer. Read-only.
Permission reviews.read (Owner, Admin, Dispatcher, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool reviews_get (toolset marketing)
Name In Type Required Description reviewIdpath string Yes
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/items/{reviewId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring reviewerNamestring reviewerPhotoUrlstring or null ratinginteger 1–5 stars (0 when Google gave none). commentstring postedAtstring (date-time) editedAtstring (date-time) replystring or null The business's public reply, when there is one. repliedAtstring (date-time) or null customerIdstring or null customerobject or null customer.idstring customer.namestring locationobject location.idstring location.titlestring
POST /organizations/{organizationId}/reviews/sync
Pulls the followed locations' reviews from Google now (it also happens every six hours). 409 when Google isn't connected. Rate-limited.
Permission reviews.manage (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool reviews_sync (toolset marketing)
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/sync" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description locationsinteger addedinteger updatedinteger
PATCH /organizations/{organizationId}/reviews/locations/{reviewLocationId}
selected: true follows the Business Profile location's reviews (synced, listed, counted); false stops. Answers the overview.
Permission reviews.manage (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool reviews_setLocation (toolset marketing)
Name In Type Required Description reviewLocationIdpath string Yes
Field Type Required Description selectedboolean Yes
curl -X PATCH "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/locations/{reviewLocationId}" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"selected":true}'
200: the answer's fields Field Type Description googleobject google.modeenum unconfigured: this server has no Google OAuth client. One of live, fake, unconfigured. google.connectedboolean google.statusstring google.accountstring or null The Google account the Business Profile is managed with. google.connectedAtstring (date-time) or null google.lastSyncAtstring (date-time) or null google.lastErrorstring or null locationsarray of object locations[].idstring locations[].titlestring locations[].addressstring locations[].reviewUrlstring or null Where customers write a review of this location. locations[].selectedboolean Reviews are followed for selected locations. locations[].lastSyncedAtstring (date-time) or null locations[].lastErrorstring or null summaryobject summary.countinteger summary.averagenumber or null summary.distributionarray of integer Counts of 1, 2, 3, 4 and 5-star reviews. summary.unansweredinteger summary.last30Daysinteger
POST /organizations/{organizationId}/reviews/items/{reviewId}/draft-reply
A reply to edit before posting, written by Claude from the review (and the matched customer's last job), or a polite template without an AI key. Nothing is posted. Rate-limited.
Permission reviews.manage (Owner, Admin, Dispatcher)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool reviews_draftReply (toolset marketing)
Name In Type Required Description reviewIdpath string Yes
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/items/{reviewId}/draft-reply" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description draftstring sourceenum One of AI, TEMPLATE.
POST /organizations/{organizationId}/reviews/items/{reviewId}/reply
Public: posts (or replaces) the business's reply on Google, where anyone can read it. Emits review.replied. 409 when Google isn't connected or refuses.
Permission reviews.manage (Owner, Admin, Dispatcher)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool reviews_reply (toolset marketing)Approval Over MCP, this tool asks for your OK first (in the AI app when it supports it, otherwise in ServFlo). See Approvals .
Name In Type Required Description reviewIdpath string Yes
Field Type Required Description commentstring Yes Up to 4000 characters.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/items/{reviewId}/reply" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"comment":"string"}'
200: the answer's fields Field Type Description idstring reviewerNamestring reviewerPhotoUrlstring or null ratinginteger 1–5 stars (0 when Google gave none). commentstring postedAtstring (date-time) editedAtstring (date-time) replystring or null The business's public reply, when there is one. repliedAtstring (date-time) or null customerIdstring or null customerobject or null customer.idstring customer.namestring locationobject location.idstring location.titlestring
DELETE /organizations/{organizationId}/reviews/items/{reviewId}/reply
Removes the business's public reply from Google. 409 when there is none.
Permission reviews.manage (Owner, Admin, Dispatcher)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool reviews_deleteReply (toolset marketing)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Name In Type Required Description reviewIdpath string Yes
curl -X DELETE "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/items/{reviewId}/reply" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description idstring reviewerNamestring reviewerPhotoUrlstring or null ratinginteger 1–5 stars (0 when Google gave none). commentstring postedAtstring (date-time) editedAtstring (date-time) replystring or null The business's public reply, when there is one. repliedAtstring (date-time) or null customerIdstring or null customerobject or null customer.idstring customer.namestring locationobject location.idstring location.titlestring
POST /organizations/{organizationId}/reviews/google/connect
Grants access: returns Google's consent URL for the Business Profile (business.manage). Google then redirects to /integrations/google/callback with code and state; finish with POST /reviews/google/callback. 400 when this server has no Google OAuth client.
Permission integrations.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool reviews_googleConnect (toolset marketing)Approval Waits for your approval in ServFlo when called with an API key or a connected app: the first call answers 428 APPROVAL_REQUIRED; once you approve it, repeat the call with the X-ServFlo-Approval header. See Approvals .
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/google/connect" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description authorizeUrlstring modeenum One of live, fake, unconfigured.
POST /organizations/{organizationId}/reviews/google/disconnect
Revokes access: revokes and forgets the Google tokens. Synced reviews and locations stay; reconnect to sync again.
Permission integrations.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool reviews_googleDisconnect (toolset marketing)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /reviews/google/disconnect" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description googleobject google.modeenum unconfigured: this server has no Google OAuth client. One of live, fake, unconfigured. google.connectedboolean google.statusstring google.accountstring or null The Google account the Business Profile is managed with. google.connectedAtstring (date-time) or null google.lastSyncAtstring (date-time) or null google.lastErrorstring or null locationsarray of object locations[].idstring locations[].titlestring locations[].addressstring locations[].reviewUrlstring or null Where customers write a review of this location. locations[].selectedboolean Reviews are followed for selected locations. locations[].lastSyncedAtstring (date-time) or null locations[].lastErrorstring or null summaryobject summary.countinteger summary.averagenumber or null summary.distributionarray of integer Counts of 1, 2, 3, 4 and 5-star reviews. summary.unansweredinteger summary.last30Daysinteger
GET /organizations/{organizationId}/feedback
What customers said when they paid, newest first, with the customer, invoice, job and technicians; filter by technician or stars. summary: how many were asked and answered, the average, the stars, how many went on to Google, and each technician's average. Read-only.
Permission reviews.read (Owner, Admin, Dispatcher, Member)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool feedback_list (toolset customers)
Name In Type Required Description technicianIdquery string No ratingquery integer No 1–5. limitquery integer No 1–200.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /feedback" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description itemsarray of object items[].idstring items[].ratinginteger 1–5 stars. items[].commentstring or null items[].submittedAtstring (date-time) or null items[].sourcestring or null Where the customer answered (pay page, receipt …). items[].postedToGoogleboolean items[].customerobject items[].customer.idstring items[].customer.namestring items[].invoiceobject items[].invoice.idstring items[].invoice.identifierstring INV-n items[].jobobject or null items[].job.idstring items[].job.identifierstring JOB-n items[].techniciansarray of object items[].technicians[].idstring items[].technicians[].namestring summaryobject summary.countinteger Answers. summary.averagenumber or null Average stars; null without answers. summary.starsarray of integer How many gave 1, 2, 3, 4 and 5 stars. summary.postedToGoogleinteger summary.askedinteger Feedback links made (asked). summary.byTechnicianarray of object summary.byTechnician[].technicianIdstring summary.byTechnician[].namestring summary.byTechnician[].countinteger summary.byTechnician[].averagenumber