Customer review management with moderation, statistics, bulk operations, CSV import/export, and multi-language support.

Moderation workflow: pendingapproved | 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

page

query

number

No

Number

limit

query

number

No

Number <= 100

status

query

"pending" | "approved" | "rejected"

No

One of: pending, approved, rejected

rating

query

number

No

Between 1 and 5

ratingMin

query

number

No

Between 1 and 5

ratingMax

query

number

No

Between 1 and 5

isFeatured

query

boolean

No

Boolean

productName

query

string

No

Associated product name

source

query

"admin" | "csv_import" | "public_form"

No

One of: admin, csv_import, public_form

search

query

string

No

Full-text search query

sortBy

query

"created_at" | "rating" | "author_name" | "display_order" | "review_date"

No

One of: created_at, rating, author_name, display_order, review_date

sortOrder

query

"asc" | "desc"

No

One of: asc, desc

dateFrom

query

string

No

Filter from date (ISO 8601)

dateTo

query

string

No

Filter until date (ISO 8601)

reviewDateFrom

query

string

No

Filter by review date from (ISO 8601)

reviewDateTo

query

string

No

Filter by review date until (ISO 8601)

slug

query

string

No

URL-friendly identifier, unique per site and locale

slugs

query

string[]

No

Array of strings

ids

query

string[]

No

Array of strings

excludeIds

query

string[]

No

Array of strings

groupByTranslation

query

boolean

No

Boolean

locale

query

string

No

BCP 47 locale code (e.g. "en", "fr")

translationGroupId

query

string

No

Translation group UUID (links translations across locales)

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

Examples

Bash
# List approved reviews
curl "https://api.lynkow.com/v1/reviews?status=approved&page=1&limit=10" \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

authorName

string

Yes

Required. 2-100 characters

authorEmail

string

No

Author email address

authorPhotoUrl

string

No

Author photo URL

authorCompany

string

No

Author company name. Max 100 characters

authorPosition

string

No

Author job title. Max 100 characters

authorCity

string

No

Author city. Max 100 characters

rating

number

Yes

Required. Between 1 and 5

content

string

Yes

Required. Text content. 10-5000 characters

title

string

No

Display title. Max 200 characters

productName

string

No

Associated product name. Max 200 characters

productSku

string

No

Associated product SKU. Max 100 characters

customFields

object

No

Custom field values

status

"pending" | "approved" | "rejected"

No

One of: pending, approved, rejected

isFeatured

boolean

No

Boolean

reviewDate

string

No

Original review date (ISO 8601)

displayOrder

number

No

Number

locale

string

No

BCP 47 locale code (e.g. "en", "fr")

Responses

Status

Description

201

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

422

Validation error

Notes: - For user-submitted reviews via the frontend, use the public API (POST /public/{siteId}/reviews/submit).

Examples

Bash
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

JSON
{
  "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

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

Examples

Bash
curl https://api.lynkow.com/v1/reviews/stats \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

Examples

Bash
curl https://api.lynkow.com/v1/reviews/settings \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

autoApproveEnabled

boolean

No

Boolean

autoApproveMinRating

number

No

Between 1 and 5

publicSubmissionEnabled

boolean

No

Boolean

requireEmail

boolean

No

Boolean

showAuthorPhoto

boolean

No

Boolean

showAuthorCompany

boolean

No

Boolean

showAuthorCity

boolean

No

Boolean

customFieldsSchema

object[]

No

Array of objects

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

422

Validation error

Examples

Bash
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

JSON
{
  "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

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

Examples

Bash
curl "https://api.lynkow.com/v1/reviews/export" \
  -H "Authorization: Bearer $API_TOKEN" \
  -o reviews.csv

Response Example

JSON
"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

201

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

422

Validation error

Notes: - Maximum 1000 rows per import.

  • Invalid rows are skipped with error details in the response.

Examples

Bash
curl -X POST https://api.lynkow.com/v1/reviews/import \
  -H "Authorization: Bearer $API_TOKEN" \
  -F "[email protected]"

Response Example

JSON
{
  "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

ids

string[]

Yes

Required. Array of strings

status

"pending" | "approved" | "rejected"

Yes

Required. One of: pending, approved, rejected

rejectionReason

string

No

Reason for rejection. Max 500 characters

Responses

Status

Description

201

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

422

Validation error

Notes: - Maximum 50 IDs per request.

Examples

Bash
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

JSON
{
  "updated": 5
}

POST /reviews/bulk-delete

Bulk delete reviews

Permanently deletes multiple reviews at once.

Responses

Status

Description

201

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

422

Validation error

Examples

Bash
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

JSON
{
  "deleted": 3
}

GET /reviews/:id

Get a review

Returns a single review with all details.

Parameters

Name

In

Type

Required

Description

id

path

string

Yes

Unique identifier

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

404

Not found

Examples

Bash
curl https://api.lynkow.com/v1/reviews/101 \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

id

path

string

Yes

Unique identifier

Request Body

Content-Type: application/json

Field

Type

Required

Description

authorName

string

No

2-100 characters

authorEmail

string | null

No

Author email address

authorPhotoUrl

string | null

No

Author photo URL

authorCompany

string | null

No

Author company name

authorPosition

string | null

No

Author job title

authorCity

string | null

No

Author city

rating

number

No

Between 1 and 5

content

string

No

Text content. 10-5000 characters

title

string | null

No

Display title

productName

string | null

No

Associated product name

productSku

string | null

No

Associated product SKU

customFields

object

No

Custom field values

status

"pending" | "approved" | "rejected"

No

One of: pending, approved, rejected

rejectionReason

string | null

No

Reason for rejection

isFeatured

boolean

No

Boolean

reviewDate

string | null

No

Original review date (ISO 8601)

displayOrder

number

No

Number

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

404

Not found

422

Validation error

Examples

Bash
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

JSON
{
  "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

id

path

string

Yes

Unique identifier

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

404

Not found

Examples

Bash
curl -X DELETE https://api.lynkow.com/v1/reviews/101 \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

id

path

string

Yes

Unique identifier

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

404

Not found

Examples

Bash
curl https://api.lynkow.com/v1/reviews/101/translations \
  -H "Authorization: Bearer $API_TOKEN"

Response Example

JSON
{
  "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

id

path

string

Yes

Unique identifier

Request Body

Content-Type: application/json

Field

Type

Required

Description

targetLocale

string

Yes

Required

Responses

Status

Description

200

Successful response

401

Unauthorized — invalid or missing API token

403

Forbidden — insufficient permissions

404

Not found

422

Validation error

Examples

Bash
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

JSON
{
  "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"
  }
}