Customer review management with moderation, statistics, bulk operations, CSV import/export, and multi-language support.
Moderation workflow: pending → approved | rejected
Reviews submitted via the public API start in pending status and
require moderation before appearing publicly.
14 endpoints
GET /reviews
List reviews
Returns paginated reviews. Supports filtering by status, rating, locale, and date range.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| query | number | No | Number |
| query | number | No | Number <= 100 |
| query | "pending" | "approved" | "rejected" | No | One of: pending, approved, rejected |
| query | number | No | Between 1 and 5 |
| query | number | No | Between 1 and 5 |
| query | number | No | Between 1 and 5 |
| query | boolean | No | Boolean |
| query | string | No | Associated product name |
| query | "admin" | "csv_import" | "public_form" | No | One of: admin, csv_import, public_form |
| query | string | No | Full-text search query |
| query | "created_at" | "rating" | "author_name" | "display_order" | "review_date" | No | One of: created_at, rating, author_name, display_order, review_date |
| query | "asc" | "desc" | No | One of: asc, desc |
| query | string | No | Filter from date (ISO 8601) |
| query | string | No | Filter until date (ISO 8601) |
| query | string | No | Filter by review date from (ISO 8601) |
| query | string | No | Filter by review date until (ISO 8601) |
| query | string | No | URL-friendly identifier, unique per site and locale |
| query | string[] | No | Array of strings |
| query | string[] | No | Array of strings |
| query | string[] | No | Array of strings |
| query | boolean | No | Boolean |
| query | string | No | BCP 47 locale code (e.g. "en", "fr") |
| query | string | No | Translation group UUID (links translations across locales) |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
Examples
# List approved reviews
curl "https://api.lynkow.com/v1/reviews?status=approved&page=1&limit=10" \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"data": [
{
"id": 101,
"title": "Excellent platform",
"content": "Lynkow made managing our website content incredibly easy.",
"rating": 5,
"status": "approved",
"authorName": "Marie Dupont",
"authorEmail": "[email protected]",
"authorCompany": "Acme Corp",
"authorCity": "Paris",
"isFeatured": true,
"locale": "en",
"createdAt": "2025-04-01T14:22:00.000Z"
},
{
"id": 102,
"title": "Good but could improve",
"content": "The API is solid. Would love to see webhooks for reviews.",
"rating": 4,
"status": "approved",
"authorName": "John Smith",
"authorEmail": "[email protected]",
"authorCompany": null,
"authorCity": "London",
"isFeatured": false,
"locale": "en",
"createdAt": "2025-03-28T09:15:00.000Z"
}
],
"meta": {
"total": 67,
"perPage": 15,
"currentPage": 1,
"lastPage": 5,
"averageRating": "4.35",
"totalApproved": 54
}
}POST /reviews
Create a review
Creates a review as an admin (bypasses moderation). Set status to
"approved" to make it immediately public.
Request Body
Content-Type: application/json
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Required. 2-100 characters |
| string | No | Author email address |
| string | No | Author photo URL |
| string | No | Author company name. Max 100 characters |
| string | No | Author job title. Max 100 characters |
| string | No | Author city. Max 100 characters |
| number | Yes | Required. Between 1 and 5 |
| string | Yes | Required. Text content. 10-5000 characters |
| string | No | Display title. Max 200 characters |
| string | No | Associated product name. Max 200 characters |
| string | No | Associated product SKU. Max 100 characters |
| object | No | Custom field values |
| "pending" | "approved" | "rejected" | No | One of: pending, approved, rejected |
| boolean | No | Boolean |
| string | No | Original review date (ISO 8601) |
| number | No | Number |
| string | No | BCP 47 locale code (e.g. "en", "fr") |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Validation error |
Notes: - For user-submitted reviews via the frontend, use the public API (
POST /public/{siteId}/reviews/submit).
Examples
curl -X POST https://api.lynkow.com/v1/reviews \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Great product!",
"content": "Easy to integrate and the docs are excellent.",
"rating": 5,
"authorName": "Alice Martin",
"authorEmail": "[email protected]",
"status": "approved"
}'Response Example
{
"data": {
"id": 103,
"title": "Great product!",
"content": "Easy to integrate and the docs are excellent.",
"rating": 5,
"status": "approved",
"authorName": "Alice Martin",
"authorEmail": "[email protected]",
"isFeatured": false,
"locale": "en",
"createdAt": "2025-04-06T11:00:00.000Z"
}
}GET /reviews/stats
Get review statistics
Returns aggregate statistics: average rating, total count, and distribution by rating (1-5 stars).
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
Examples
curl https://api.lynkow.com/v1/reviews/stats \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"total": 67,
"byStatus": {
"pending": 8,
"approved": 54,
"rejected": 5
},
"averageRating": 4.35,
"ratingDistribution": {
"1": 2,
"2": 3,
"3": 8,
"4": 17,
"5": 24
},
"featuredCount": 6,
"thisMonth": 12
}GET /reviews/settings
Get review settings
Returns the moderation settings (auto-approve threshold, notification preferences).
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
Examples
curl https://api.lynkow.com/v1/reviews/settings \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"data": {
"autoApprove": false,
"requireEmail": true,
"notifyOnNew": true,
"minRatingAutoApprove": null
}
}PUT /reviews/settings
Update review settings
Updates review moderation configuration.
Request Body
Content-Type: application/json
Field | Type | Required | Description |
|---|---|---|---|
| boolean | No | Boolean |
| number | No | Between 1 and 5 |
| boolean | No | Boolean |
| boolean | No | Boolean |
| boolean | No | Boolean |
| boolean | No | Boolean |
| boolean | No | Boolean |
| object[] | No | Array of objects |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Validation error |
Examples
curl -X PUT https://api.lynkow.com/v1/reviews/settings \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"autoApprove": false,
"requireEmail": true,
"notifyOnNew": true
}'Response Example
{
"data": {
"autoApprove": false,
"requireEmail": true,
"notifyOnNew": true,
"minRatingAutoApprove": null
}
}GET /reviews/export
Export reviews as CSV
Downloads all reviews as a CSV file.
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
Examples
curl "https://api.lynkow.com/v1/reviews/export" \
-H "Authorization: Bearer $API_TOKEN" \
-o reviews.csvResponse Example
"Returns a CSV file (Content-Type: text/csv). Example output:\nid,title,content,rating,status,author_name,author_email,created_at\n101,\"Excellent platform\",\"Lynkow made managing...\",5,\"approved\",\"Marie Dupont\",\"[email protected]\",\"2025-04-01 14:22:00\"\n"POST /reviews/import
Import reviews from CSV
Imports reviews from a CSV file. Expected columns: rating, title, content, authorName, status.
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Validation error |
Notes: - Maximum 1000 rows per import.
Invalid rows are skipped with error details in the response.
Examples
curl -X POST https://api.lynkow.com/v1/reviews/import \
-H "Authorization: Bearer $API_TOKEN" \
-F "[email protected]"Response Example
{
"imported": 42,
"errors": []
}POST /reviews/bulk-status
Bulk update review status
Approves or rejects multiple reviews at once. Provide an array of review IDs and the target status.
Request Body
Content-Type: application/json
Field | Type | Required | Description |
|---|---|---|---|
| string[] | Yes | Required. Array of strings |
| "pending" | "approved" | "rejected" | Yes | Required. One of: pending, approved, rejected |
| string | No | Reason for rejection. Max 500 characters |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Validation error |
Notes: - Maximum 50 IDs per request.
Examples
curl -X POST https://api.lynkow.com/v1/reviews/bulk-status \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [101, 102, 103, 104, 105], "status": "approved"}'Response Example
{
"updated": 5
}POST /reviews/bulk-delete
Bulk delete reviews
Permanently deletes multiple reviews at once.
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Validation error |
Examples
curl -X POST https://api.lynkow.com/v1/reviews/bulk-delete \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"ids": [104, 105, 106]}'Response Example
{
"deleted": 3
}GET /reviews/:id
Get a review
Returns a single review with all details.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| path | string | Yes | Unique identifier |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Not found |
Examples
curl https://api.lynkow.com/v1/reviews/101 \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"data": {
"id": 101,
"title": "Excellent platform",
"content": "Lynkow made managing our website content incredibly easy.",
"rating": 5,
"status": "approved",
"authorName": "Marie Dupont",
"authorEmail": "[email protected]",
"authorCompany": "Acme Corp",
"authorCity": "Paris",
"isFeatured": true,
"locale": "en",
"createdAt": "2025-04-01T14:22:00.000Z",
"updatedAt": "2025-04-05T09:00:00.000Z"
}
}PUT /reviews/:id
Update a review
Updates a review's content, rating, author info, or status.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| path | string | Yes | Unique identifier |
Request Body
Content-Type: application/json
Field | Type | Required | Description |
|---|---|---|---|
| string | No | 2-100 characters |
| string | null | No | Author email address |
| string | null | No | Author photo URL |
| string | null | No | Author company name |
| string | null | No | Author job title |
| string | null | No | Author city |
| number | No | Between 1 and 5 |
| string | No | Text content. 10-5000 characters |
| string | null | No | Display title |
| string | null | No | Associated product name |
| string | null | No | Associated product SKU |
| object | No | Custom field values |
| "pending" | "approved" | "rejected" | No | One of: pending, approved, rejected |
| string | null | No | Reason for rejection |
| boolean | No | Boolean |
| string | null | No | Original review date (ISO 8601) |
| number | No | Number |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Not found |
| Validation error |
Examples
curl -X PUT https://api.lynkow.com/v1/reviews/101 \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"status": "approved",
"isFeatured": true
}'Response Example
{
"data": {
"id": 101,
"title": "Excellent platform",
"content": "Lynkow made managing our website content incredibly easy.",
"rating": 5,
"status": "approved",
"authorName": "Marie Dupont",
"authorEmail": "[email protected]",
"isFeatured": true,
"locale": "en",
"createdAt": "2025-04-01T14:22:00.000Z",
"updatedAt": "2025-04-06T12:00:00.000Z"
}
}DELETE /reviews/:id
Delete a review
Permanently deletes a review.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| path | string | Yes | Unique identifier |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Not found |
Examples
curl -X DELETE https://api.lynkow.com/v1/reviews/101 \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"message": "Review deleted"
}GET /reviews/:id/translations
Get review translation status
Returns the translation status for this review across all enabled locales.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| path | string | Yes | Unique identifier |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Not found |
Examples
curl https://api.lynkow.com/v1/reviews/101/translations \
-H "Authorization: Bearer $API_TOKEN"Response Example
{
"data": {
"en": {
"status": "complete"
},
"fr": {
"status": "missing"
},
"es": {
"status": "partial"
}
}
}POST /reviews/:id/copy-to-locale
Copy review to another locale
Creates a translated copy of this review in the target locale.
Parameters
Name | In | Type | Required | Description |
|---|---|---|---|---|
| path | string | Yes | Unique identifier |
Request Body
Content-Type: application/json
Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Required |
Responses
Status | Description |
|---|---|
| Successful response |
| Unauthorized — invalid or missing API token |
| Forbidden — insufficient permissions |
| Not found |
| Validation error |
Examples
curl -X POST https://api.lynkow.com/v1/reviews/101/copy-to-locale \
-H "Authorization: Bearer $API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"locale": "fr"}'Response Example
{
"data": {
"id": 150,
"title": "Excellent platform",
"content": "Lynkow made managing our website content incredibly easy.",
"rating": 5,
"status": "approved",
"authorName": "Marie Dupont",
"locale": "fr",
"createdAt": "2025-04-06T15:00:00.000Z",
"updatedAt": "2025-04-06T15:00:00.000Z"
}
}