> For the complete documentation index, see [llms.txt](https://docs.moregoodreviews.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.moregoodreviews.com/platform/api-reference/reviews.md).

# Reviews

Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.

## List Reviews

> Retrieve project reviews with facet, source, location, score, and tag filters, optional sorting by rating or timestamps, and calendar bounds on a chosen review datetime column.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}},"schemas":{"SpriteClass":{"type":"string","maxLength":50,"pattern":"^(fab|fad|fak|fal|far|fas|fat)\\s+fa-[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Font Awesome icon: two CSS class names as used with Font Awesome Web Fonts / classic CSS (not SVG/React props).\nFormat is a style prefix (`fab`, `fad`, `fak`, `fal`, `far`, `fas`, or `fat`), one ASCII space, then an icon slug\nstarting with `fa-` (lowercase letters and digits, hyphen-separated words). Examples: `fab fa-google`, `fas fa-star`.\nOn write, omit, send null, or whitespace-only to clear. Font Awesome 6 semantic pairs such as `fa-solid fa-star`\nare not accepted; use `fas fa-star` instead."}}},"paths":{"/reviews":{"get":{"tags":["Reviews"],"summary":"List Reviews","operationId":"listReviews","description":"Retrieve project reviews with facet, source, location, score, and tag filters, optional sorting by rating or timestamps, and calendar bounds on a chosen review datetime column.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"array","description":"Response payload for the request.","items":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"score":{"type":"integer","description":"Score for this resource."},"review":{"type":"string","description":"Review for this resource."},"review_html":{"type":"string","description":"Review html for this resource."},"reply":{"type":"string","description":"Reply text associated with the review or message."},"is_hidden":{"type":"boolean","description":"Is hidden for this resource."},"is_duplicate":{"type":"boolean","description":"Is duplicate for this resource."},"has_highlights":{"type":"boolean","description":"Has highlights for this resource."},"can_reply":{"type":"boolean","description":"Can reply for this resource."},"has_reply":{"type":"boolean","description":"Has reply for this resource."},"external_url":{"type":"string","description":"External url for this resource."},"platform_url":{"type":"string","description":"Absolute URL to this review in the web console; uses the agency white-label host when configured."},"replied_at":{"type":"integer","description":"Unix timestamp when a reply was posted."},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"customer":{"type":"object","description":"Customer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"color":{"type":"string","description":"Hex color associated with the resource."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."}}},"location":{"type":"object","description":"Location for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"display_name":{"type":"string","description":"Public display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"store_code":{"type":"string","description":"Internal store identifier for this location."},"title":{"type":"string","description":"Title or headline for the resource."},"address":{"type":"string","description":"Address for this resource."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."}}},"rating":{"type":"object","description":"Numeric rating value for the review.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"score":{"type":"integer","description":"Score for this resource."},"label":{"type":"string","description":"Label for this resource."}}},"reviewer":{"type":"object","description":"Reviewer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"name":{"type":"string","description":"Display name for this resource."},"photo_url":{"type":"string","description":"Photo url for this resource."}}},"source":{"type":"object","description":"Source system or review platform for this record.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"sprite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SpriteClass"}]},"color":{"type":"string","description":"Hex color associated with the resource."},"icon":{"type":"string","description":"Icon for this resource.","nullable":true}}},"fields":{"type":"array","description":"List of fields for this resource.","items":{"type":"object","description":"Fields for this resource.","properties":{"name":{"type":"string","description":"Display name for this resource."},"value":{"type":"string","description":"Stored value for this field."}}}},"tags":{"type":"array","description":"Maximum or current allowance for tag records.","items":{"type":"object","description":"Maximum or current allowance for tag records.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."}}}}}}},"pagination":{"type":"object","description":"Pagination metadata for list responses.","properties":{"current_page":{"type":"integer","description":"Current page number in the paginated result set."},"from":{"type":"integer","description":"Index of the first item returned on the current page."},"last_page":{"type":"integer","description":"Last available page number in the paginated result set."},"path":{"type":"string","description":"Base API path used for the paginated result set."},"per_page":{"type":"integer","description":"Number of items returned per page."},"to":{"type":"integer","description":"Index of the last item returned on the current page."},"total":{"type":"integer","description":"Total number of matching items."}}}}}}}}},"parameters":[{"name":"date_from","in":"query","required":false,"schema":{"type":"string","format":"date","nullable":true,"description":"Inclusive lower calendar date (YYYY-MM-DD) for the column chosen by date_key, defaulting to created_at when date_key is omitted."},"description":"Inclusive lower calendar date (YYYY-MM-DD) for the column chosen by date_key, defaulting to created_at when date_key is omitted."},{"name":"date_key","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Review datetime column paired with date_from and date_to (defaults to created_at when omitted).","enum":["created_at","replied_at","updated_at"]},"description":"Review datetime column paired with date_from and date_to (defaults to created_at when omitted)."},{"name":"date_to","in":"query","required":false,"schema":{"type":"string","format":"date","nullable":true,"description":"Inclusive upper calendar date (YYYY-MM-DD) for the column chosen by date_key; must be on or after date_from when both bounds are provided."},"description":"Inclusive upper calendar date (YYYY-MM-DD) for the column chosen by date_key; must be on or after date_from when both bounds are provided."},{"name":"filter","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Review list facet aligned with console filters (non-duplicates unless duplicate is selected).","enum":["anonymous","duplicate","hidden","identified","native","visible","with-highlights","with-replies","without-replies","written"]},"description":"Filter reviews by visibility, platform, duplication, replies, content, or audience."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Maximum number of records to return."},"description":"Maximum number of records to return."},{"name":"location_id","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Unique numeric identifier for the location."},"description":"Filter reviews by location ID."},{"name":"location_slug","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"URL-friendly identifier for the location."},"description":"Filter reviews by location slug."},{"name":"location_uuid","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Stable UUID for the location."},"description":"Filter reviews by location UUID."},{"name":"score","in":"query","required":false,"schema":{"type":"integer","nullable":true,"minimum":1,"maximum":5,"description":"Numeric rating score for the review."},"description":"Filter reviews by rating score."},{"name":"source_id","in":"query","required":false,"schema":{"type":"integer","nullable":true,"description":"Identifier for the source system or review platform."},"description":"Filter reviews by source ID."},{"name":"source_slug","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Source slug for this resource."},"description":"Filter reviews by source slug."},{"name":"source_uuid","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Source uuid for this resource."},"description":"Filter reviews by source UUID."},{"name":"sort_dir","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Sort direction applied when sort_key is set (defaults to desc when omitted).","enum":["asc","desc"]},"description":"Sort direction: asc or desc."},{"name":"sort_key","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"Review attribute to sort by; omit to use newest-first by creation time.","enum":["score","replied_at","created_at","updated_at"]},"description":"Review attribute to sort by."},{"name":"tag_slug","in":"query","required":false,"schema":{"type":"string","nullable":true,"description":"URL-friendly identifier for the review tag."},"description":"Filter reviews by tag slug."}]}}}}
```

## Create Review

> Create a review for a customer identified by email or phone, creating the customer when needed, with optional source, location, tags, and review date.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}},"schemas":{"SpriteClass":{"type":"string","maxLength":50,"pattern":"^(fab|fad|fak|fal|far|fas|fat)\\s+fa-[a-z0-9]+(?:-[a-z0-9]+)*$","description":"Font Awesome icon: two CSS class names as used with Font Awesome Web Fonts / classic CSS (not SVG/React props).\nFormat is a style prefix (`fab`, `fad`, `fak`, `fal`, `far`, `fas`, or `fat`), one ASCII space, then an icon slug\nstarting with `fa-` (lowercase letters and digits, hyphen-separated words). Examples: `fab fa-google`, `fas fa-star`.\nOn write, omit, send null, or whitespace-only to clear. Font Awesome 6 semantic pairs such as `fa-solid fa-star`\nare not accepted; use `fas fa-star` instead."},"ProjectApiDateTimeInput":{"description":"Optional instant for request bodies: Unix timestamp as integer (seconds), or a date/time string of at most\n50 characters that PHP Carbon can parse. For strings, ISO-8601 / RFC 3339 (for example 2026-04-28T15:30:00Z) is the\nrecommended format in examples and client integrations. Invalid values fail validation. When the field is omitted\nor null, the API uses the current server time where that behavior is documented on the operation.","nullable":true,"oneOf":[{"type":"integer","description":"Unix timestamp in seconds since the Unix epoch."},{"type":"string","maxLength":50,"description":"Date/time string parseable by Carbon; prefer ISO-8601 / RFC 3339; maximum 50 characters."}]}}},"paths":{"/reviews":{"post":{"tags":["Reviews"],"summary":"Create Review","operationId":"createReview","description":"Create a review for a customer identified by email or phone, creating the customer when needed, with optional source, location, tags, and review date.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."},"data":{"type":"object","description":"Response payload for the request.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"score":{"type":"integer","description":"Score for this resource."},"review":{"type":"string","description":"Review for this resource."},"review_html":{"type":"string","description":"Review html for this resource."},"reply":{"type":"string","description":"Reply text associated with the review or message."},"is_hidden":{"type":"boolean","description":"Is hidden for this resource."},"is_duplicate":{"type":"boolean","description":"Is duplicate for this resource."},"has_highlights":{"type":"boolean","description":"Has highlights for this resource."},"can_reply":{"type":"boolean","description":"Can reply for this resource."},"has_reply":{"type":"boolean","description":"Has reply for this resource."},"external_url":{"type":"string","description":"External url for this resource."},"platform_url":{"type":"string","description":"Absolute URL to this review in the web console; uses the agency white-label host when configured."},"replied_at":{"type":"integer","description":"Unix timestamp when a reply was posted."},"created_at":{"type":"integer","description":"Unix timestamp when this resource was created."},"customer":{"type":"object","description":"Customer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"color":{"type":"string","description":"Hex color associated with the resource."},"platform_url":{"type":"string","description":"Absolute URL to this customer in the web console; uses the agency white-label host when configured."}}},"location":{"type":"object","description":"Location for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"project_id":{"type":"integer","description":"Unique numeric identifier for the project."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"display_name":{"type":"string","description":"Public display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"store_code":{"type":"string","description":"Internal store identifier for this location."},"title":{"type":"string","description":"Title or headline for the resource."},"address":{"type":"string","description":"Address for this resource."},"address1":{"type":"string","description":"Primary street address line."},"address2":{"type":"string","description":"Secondary street address line, such as suite or apartment."},"city":{"type":"string","description":"City for the address."},"state":{"type":"string","description":"State, province, or region for the address."},"postal_code":{"type":"string","description":"Postal or ZIP code for the address."}}},"rating":{"type":"object","description":"Numeric rating value for the review.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"score":{"type":"integer","description":"Score for this resource."},"label":{"type":"string","description":"Label for this resource."}}},"reviewer":{"type":"object","description":"Reviewer for this resource.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"name":{"type":"string","description":"Display name for this resource."},"photo_url":{"type":"string","description":"Photo url for this resource."}}},"source":{"type":"object","description":"Source system or review platform for this record.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."},"sprite":{"nullable":true,"allOf":[{"$ref":"#/components/schemas/SpriteClass"}]},"color":{"type":"string","description":"Hex color associated with the resource."},"icon":{"type":"string","description":"Icon for this resource.","nullable":true}}},"fields":{"type":"array","description":"List of fields for this resource.","items":{"type":"object","description":"Fields for this resource.","properties":{"name":{"type":"string","description":"Display name for this resource."},"value":{"type":"string","description":"Stored value for this field."}}}},"tags":{"type":"array","description":"Maximum or current allowance for tag records.","items":{"type":"object","description":"Maximum or current allowance for tag records.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for this resource."},"uuid":{"type":"string","description":"Stable UUID for this resource."},"name":{"type":"string","description":"Display name for this resource."},"slug":{"type":"string","description":"URL-friendly identifier for this resource."}}}}}}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Payload for creating a review and optionally finding or creating the customer.","properties":{"first_name":{"type":"string","description":"Customer first name."},"score":{"type":"integer","minimum":1,"maximum":5,"description":"Star rating from 1 to 5."},"last_name":{"type":"string","description":"Customer last name."},"email":{"type":"string","description":"Email address used to find or create the customer."},"phone":{"type":"string","description":"Phone number used to find or create the customer."},"customer_photo_url":{"type":"string","format":"uri","maxLength":500,"description":"Public image URL downloaded and stored as the customer photo before the review is created. Returns 400 if the URL cannot be fetched or is not a valid image."},"company":{"type":"string","description":"Company or organization name associated with the customer."},"review":{"type":"string","maxLength":5000,"description":"Plain-text review body; HTML is derived server-side."},"external_url":{"type":"string","format":"uri","maxLength":500,"description":"Public URL of the review on an external site (for example Google or Yelp)."},"created_at":{"$ref":"#/components/schemas/ProjectApiDateTimeInput"},"location_slug":{"type":"string","maxLength":50,"description":"Slug of an existing project location. Returns 404 if the slug is not found."},"source_slug":{"type":"string","maxLength":50,"description":"Slug of an existing review source. Returns 404 if the slug is not found."},"tag_slugs":{"type":"array","description":"Review tag slugs to assign after create.","items":{"type":"string","maxLength":50,"description":"URL-friendly identifier for a review tag."}}},"required":["first_name","score"]}}}}}}}}
```

## Delete Review

> Remove a review that should no longer be reconciled.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}":{"delete":{"tags":["Reviews"],"summary":"Delete Review","operationId":"deleteReview","description":"Remove a review that should no longer be reconciled.","responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response data for this resource.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Short code or application-level status code for this resource."}}}}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this resource."},"description":"Unique numeric identifier for this resource."}]}}}}
```

## Update Review Location

> Assign an existing project location to a review by slug. Returns 404 if the location slug is not found.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/location":{"put":{"tags":["Reviews"],"summary":"Update Review Location","operationId":"updateReviewLocation","description":"Assign an existing project location to a review by slug. Returns 404 if the location slug is not found.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body with the location slug to assign.","properties":{"location_slug":{"type":"string","maxLength":50,"description":"Slug of an existing project location. Returns 404 if the slug is not found."}},"required":["location_slug"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this review."},"description":"Unique numeric identifier for this review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Update Review Source

> Assign an existing review source to a review by slug. Returns 404 if the source slug is not found.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/source":{"put":{"tags":["Reviews"],"summary":"Update Review Source","operationId":"updateReviewSource","description":"Assign an existing review source to a review by slug. Returns 404 if the source slug is not found.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body with the source slug to assign.","properties":{"source_slug":{"type":"string","maxLength":50,"description":"Slug of an existing review source. Returns 404 if the slug is not found."}},"required":["source_slug"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this review."},"description":"Unique numeric identifier for this review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Update Review Visibility

> Show or hide a review in public displays.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/flag-hidden":{"put":{"tags":["Reviews"],"summary":"Update Review Visibility","operationId":"updateReviewVisibility","description":"Show or hide a review in public displays.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body containing the desired review visibility flag.","properties":{"is_hidden":{"type":"boolean","description":"Whether this review should be hidden from public displays."}},"required":["is_hidden"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this review."},"description":"Unique numeric identifier for this review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Update Review Duplicate Flag

> Mark whether a review is a duplicate record.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/flag-duplicate":{"put":{"tags":["Reviews"],"summary":"Update Review Duplicate Flag","operationId":"updateReviewDuplicateFlag","description":"Mark whether a review is a duplicate record.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body containing the desired duplicate flag.","properties":{"is_duplicate":{"type":"boolean","description":"Whether this review should be marked as a duplicate."}},"required":["is_duplicate"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for this review."},"description":"Unique numeric identifier for this review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Mark Review Replied

> Set or clear replied\_at when a reply was handled outside the platform without changing stored reply text.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/mark-replied":{"put":{"tags":["Reviews"],"summary":"Mark Review Replied","operationId":"markReviewReplied","description":"Set or clear replied_at when a reply was handled outside the platform without changing stored reply text.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body toggling whether the review counts as replied.","properties":{"replied":{"type":"boolean","description":"When true, records the current time as replied_at; when false, clears replied_at."}},"required":["replied"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the review."},"description":"Unique numeric identifier for the review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Reply to Review on Integration

> Publish or replace the business owner's reply on the review's connected platform (such as Google Business Profile or Facebook) using the project's active integration credentials; accepts manual reply text only and does not invoke AI drafting.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/reply":{"put":{"tags":["Reviews"],"summary":"Reply to Review on Integration","operationId":"updateReviewIntegrationReply","description":"Publish or replace the business owner's reply on the review's connected platform (such as Google Business Profile or Facebook) using the project's active integration credentials; accepts manual reply text only and does not invoke AI drafting.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body with the owner reply to send to the third-party review platform API.","properties":{"reply":{"type":"string","description":"Reply text to post or update on the external platform (for example Google or Facebook).","maxLength":4000}},"required":["reply"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false,"description":"Unique numeric identifier for the review."},"description":"Unique numeric identifier for the review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Update Review Tags

> Replace the tag assignments for a review using the provided slug list.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/tags":{"put":{"tags":["Reviews"],"summary":"Update Review Tags","operationId":"updateReviewTags","description":"Replace the tag assignments for a review using the provided slug list.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Request body listing tag slugs to apply; omitting unrelated tags removes them from the review.","properties":{"tag_slugs":{"type":"array","description":"Tag slugs to assign; send an empty array to clear all tags from this review.","items":{"type":"string","description":"Project tag slug."}}},"required":["tag_slugs"]}}}},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"},"description":"Unique numeric identifier for the review."}],"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object","description":"Object containing response status for the request.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code returned by this API."}}}}}}}}}}}
```

## Create Review Share Image

> Render a share-card PNG using optional template styling and aspect ratio, persist the image, and return CDN-backed metadata.

```json
{"openapi":"3.0.3","info":{"title":"MGR Project API","version":"1.0.0"},"tags":[{"description":"Review records collected for the project across its connected sources; list, moderate, share, tag, mark replied, or remove as integrations require.","name":"Reviews"}],"servers":[{"url":"https://api.moregoodreviews.com/project"}],"security":[{"ApiKey":[]}],"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"ApiKey"}}},"paths":{"/reviews/{id}/share-image":{"post":{"tags":["Reviews"],"summary":"Create Review Share Image","operationId":"createReviewShareImage","description":"Render a share-card PNG using optional template styling and aspect ratio, persist the image, and return CDN-backed metadata.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","nullable":false},"description":"Unique numeric identifier for the review."}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","description":"Optionally pick a saved share template and export aspect ratio; send an empty object for built-in defaults at 1:1.","properties":{"ratio":{"type":"string","description":"Export aspect ratio; when set, overrides the ratio saved on the chosen template or the default preset.","enum":["1:1","4:5","9:16"]},"template_id":{"type":"integer","description":"Numeric id of a share template on this project; omit to merge only built-in defaults."}}}}}},"responses":{"200":{"description":"Generated share PNG exposed as Image metadata with a full HTTPS link matching other API image fields.","content":{"application/json":{"schema":{"type":"object","description":"Standard success envelope with ImageTransformer fields flattened into data like other singleton resources.","properties":{"success":{"type":"boolean","description":"Indicates whether the request completed successfully."},"code":{"type":"integer","description":"Application-level status code mirroring HTTP 200 on success."},"data":{"type":"object","description":"Transformed CDN-backed image backing the PNG share artifact.","properties":{"id":{"type":"integer","description":"Unique numeric identifier for the stored image asset."},"uuid":{"type":"string","description":"Stable UUID for the image asset and cache headers."},"link":{"type":"string","description":"Full HTTPS CDN URL referencing the PNG share card artifact."}},"required":["id","uuid","link"]}},"required":["success","code","data"]}}}}}}}}}
```
