API Reference

reviewhook.dev exposes a clean, consistent REST API. All endpoints return JSON. Most require a private key in the api-key header; the GET /reviews endpoints also accept a public key in api-key-public. Times are ISO-8601 UTC.

Base URL https://api.reviewhook.dev Version 0.1 Auth api-key · api-key-public

Authentication

reviewhook.dev uses a pair of API keys per workspace: a private key that authorizes every endpoint, and a public key scoped only to read-only review data. Both are passed as plain headers — no OAuth, no bearer-token dance.

Private header api-key Public header api-key-public Scope workspace

The two key types

Each workspace is issued one private and one public key. They have different prefixes, different headers, and different scopes.

Private Full access
Prefix rev_live_xxx
Header api-key
Allowed on All endpoints

Treat this like a password. Store it in a secret manager; never ship it in a client-side bundle or commit it to source control.

Public Read reviews only
Prefix rev_pub_xxx
Header api-key-public
Allowed on GET /reviews, GET /reviews/:reviewId

Safe to embed in a widget, marketing site, or mobile app to render a read-only reviews feed. Cannot post replies or modify platform connections.

Using the keys

Send exactly one of the two headers on every request. If both are present, the private key takes precedence.

Private key — any endpoint
api-key header
curl https://api.reviewhook.dev/reviews \
  -H "api-key: rev_live_9f8b...a1c2" \
  -G -d "platform=g2" -d "minRating=4"
Public key — GET /reviews only
api-key-public header
curl https://api.reviewhook.dev/reviews \
  -H "api-key-public: rev_pub_3d2f...71ea" \
  -G -d "platform=g2" -d "minRating=4"
info
Endpoint-level labels. Every endpoint card below is tagged Private key or Public or private so it's obvious at a glance which keys are accepted.

Reviews

GET /reviews Public or private

List reviews across all connected platforms with rich filters, pagination, and sort.

Parameters 12
Name In Type Description
page query integer 1-indexed page number. Defaults to the server-side pagination default.
page
1-indexed page number. Defaults to the server-side pagination default.
limit query integer Items per page. Defaults to the server-side pagination default.
limit
Items per page. Defaults to the server-side pagination default.
sort query ReviewSortEnum Sort order for the result set. Defaults to highest_rating.
sort
Sort order for the result set. Defaults to highest_rating.
minRating query integer Minimum star rating (1–5).
minRating
Minimum star rating (1–5).
rating query integer Exact star rating (1–5). When present, overrides minRating / maxRating.
rating
Exact star rating (1–5). When present, overrides minRating / maxRating.
platform query ReviewPlatform Filter by source platform (app_store, google_play, g2, google_business, trustpilot, yelp).
platform
Filter by source platform (app_store, google_play, g2, google_business, trustpilot, yelp).
maxRating query integer Maximum star rating (1–5).
maxRating
Maximum star rating (1–5).
authorName query string Substring match on the reviewer's display name.
authorName
Substring match on the reviewer's display name.
productName query string Substring match on the product or listing name.
productName
Substring match on the product or listing name.
hasResponse query boolean Return only reviews with (true) or without (false) an existing reply.
hasResponse
Return only reviews with (true) or without (false) an existing reply.
fromDate query ISO-8601 Lower bound on createdAt. ISO-8601 date or date-time.
fromDate
Lower bound on createdAt. ISO-8601 date or date-time.
toDate query ISO-8601 Upper bound on createdAt. ISO-8601 date or date-time.
toDate
Upper bound on createdAt. ISO-8601 date or date-time.
Responses
200 Paginated list of Review objects.
Example response
application/json
{
  "data": [
    {
      "id": "rev_7b3d9c42-8f1a-4d21-9e6a-2b4f8c1e0a33",
      "platformReviewId": "g2-rev-7b3d9c42",
      "platform": "g2",
      "rating": 5,
      "title": "Saved our eng team a full sprint",
      "text": "Centralized reviews across Play Store and G2 in under an hour. Webhooks just worked.",
      "authorId": "g2_user_8821",
      "authorName": "Maya Chen",
      "productId": "g2_prod_2201",
      "productName": "reviewhook.dev",
      "createdAt": "2026-04-18T14:22:08Z",
      "updatedAt": "2026-04-18T14:22:08Z",
      "hasResponse": false
    },
    {
      "id": "rev_3a1f8c0e-44b2-4e9a-b7c3-9d02e1f4ab77",
      "platformReviewId": "1234567890-abc",
      "platform": "app_store",
      "rating": 4,
      "title": "Great, one nit",
      "text": "Filters are fast. Would love darkmode for the portal.",
      "authorName": "dev_pascal",
      "productName": "reviewhook iOS",
      "appVersion": "2.3.1",
      "deviceInfo": { "osVersion": "iOS 17.4" },
      "createdAt": "2026-04-17T09:02:40Z",
      "updatedAt": "2026-04-20T11:48:02Z",
      "hasResponse": true,
      "responseStatus": "sent",
      "response": {
        "text": "Dark mode ships in 2.4 — appreciate the nudge!",
        "authorId": "u_team_09",
        "authorName": "reviewhook team",
        "createdAt": "2026-04-20T11:48:00Z"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 184,
    "totalPages": 10
  }
}
Response schema 2 fields +4 nested
Root object 2 fields
data Review[]

Array of matching reviews. Up to limit items.

pagination Pagination

Cursor metadata for the current page.

Referenced objects
Review 17 fields
id string

Unified review ID assigned by reviewhook.

platformReviewId string

Original review ID from the source platform.

platform ReviewPlatform

Source platform enum. app_store · google_play · g2 · google_business · trustpilot · yelp.

rating number

Star rating on a 1–5 scale, normalized across platforms.

title string ?

Review headline. Omitted where the platform has no title field.

text string

Full review body, UTF-8.

authorId string ?

Platform-specific author identifier. Omitted when anonymous.

authorName string ?

Display name as shown on the platform. Omitted when anonymous.

productId string ?

Product identifier on the source platform.

productName string

Product or listing name at time of review.

appVersion string ?

App build the reviewer was on (mobile stores only).

deviceInfo DeviceInfo ?

Device metadata for mobile-store reviews.

createdAt ISO-8601

When the review was posted on the source platform.

updatedAt ISO-8601

Last modification — edits, translations, or response changes.

hasResponse boolean

True when the brand has replied to this review.

responseStatus string ?

Upstream delivery state of the reply — queued · sent · failed.

response ReviewResponse ?

Nested response object. Present only when hasResponse is true.

ReviewResponse 4 fields
text string

Reply body as posted to the platform.

authorId string

Identifier of the team member who replied.

authorName string

Display name attached to the reply.

createdAt ISO-8601

When the reply was posted upstream.

DeviceInfo 1 field
osVersion string

Operating-system version string reported by the source, e.g. iOS 17.4 or Android 14.

Pagination 4 fields
page integer

1-indexed page number echoed back.

limit integer

Items per page that were returned.

total integer

Total reviews matching the filter.

totalPages integer

Ceiling of total / limit.

GET /reviews/{reviewId} Public or private

Fetch a single review by its unified ID.

Parameters 1
Name In Type Description
reviewId * path string Unified review ID returned by list endpoints.
reviewId
Unified review ID returned by list endpoints.
Responses
200 Review object.
404 Review not found.
Example response
application/json
{
  "id": "rev_3a1f8c0e-44b2-4e9a-b7c3-9d02e1f4ab77",
  "platformReviewId": "1234567890-abc",
  "platform": "app_store",
  "rating": 4,
  "title": "Great, one nit",
  "text": "Filters are fast. Would love darkmode for the portal.",
  "authorName": "dev_pascal",
  "productName": "reviewhook iOS",
  "appVersion": "2.3.1",
  "deviceInfo": { "osVersion": "iOS 17.4" },
  "createdAt": "2026-04-17T09:02:40Z",
  "updatedAt": "2026-04-20T11:48:02Z",
  "hasResponse": true,
  "responseStatus": "sent",
  "response": {
    "text": "Dark mode ships in 2.4 — appreciate the nudge!",
    "authorId": "u_team_09",
    "authorName": "reviewhook team",
    "createdAt": "2026-04-20T11:48:00Z"
  }
}
Response schema 17 fields +2 nested
Root object 17 fields
id string

Unified review ID assigned by reviewhook.

platformReviewId string

Original review ID from the source platform.

platform ReviewPlatform

Source platform enum. app_store · google_play · g2 · google_business · trustpilot · yelp.

rating number

Star rating on a 1–5 scale, normalized across platforms.

title string ?

Review headline. Omitted where the platform has no title field.

text string

Full review body, UTF-8.

authorId string ?

Platform-specific author identifier. Omitted when anonymous.

authorName string ?

Display name as shown on the platform. Omitted when anonymous.

productId string ?

Product identifier on the source platform.

productName string

Product or listing name at time of review.

appVersion string ?

App build the reviewer was on (mobile stores only).

deviceInfo DeviceInfo ?

Device metadata for mobile-store reviews.

createdAt ISO-8601

When the review was posted on the source platform.

updatedAt ISO-8601

Last modification — edits, translations, or response changes.

hasResponse boolean

True when the brand has replied to this review.

responseStatus string ?

Upstream delivery state of the reply — queued · sent · failed.

response ReviewResponse ?

Nested response object. Present only when hasResponse is true.

Referenced objects
ReviewResponse 4 fields
text string

Reply body as posted to the platform.

authorId string

Identifier of the team member who replied.

authorName string

Display name attached to the reply.

createdAt ISO-8601

When the reply was posted upstream.

DeviceInfo 1 field
osVersion string

Operating-system version string reported by the source, e.g. iOS 17.4 or Android 14.

POST /reviews/{reviewId}/reply Private key

Post a public reply to a review. Routed to the correct platform automatically.

Parameters 1
Name In Type Description
reviewId * path string Unified review ID to reply to.
reviewId
Unified review ID to reply to.
Request body
application/json
{
  "text": "Thanks for your feedback — fixed in v2.3!"
}
Responses
201 Reply accepted. The updated Review is returned with response populated.
400 Validation failure (character limit, forbidden terms).
409 Reply already exists for this review.
Example response
application/json
{
  "id": "rev_7b3d9c42-8f1a-4d21-9e6a-2b4f8c1e0a33",
  "platformReviewId": "g2-rev-7b3d9c42",
  "platform": "g2",
  "rating": 5,
  "title": "Saved our eng team a full sprint",
  "text": "Centralized reviews across Play Store and G2 in under an hour.",
  "authorId": "g2_user_8821",
  "authorName": "Maya Chen",
  "productId": "g2_prod_2201",
  "productName": "reviewhook.dev",
  "createdAt": "2026-04-18T14:22:08Z",
  "updatedAt": "2026-04-23T10:14:55Z",
  "hasResponse": true,
  "responseStatus": "queued",
  "response": {
    "text": "Thanks for your feedback — fixed in v2.3!",
    "authorId": "u_team_09",
    "authorName": "reviewhook team",
    "createdAt": "2026-04-23T10:14:55Z"
  }
}
Response schema 17 fields +2 nested
Root object 17 fields
id string

Unified review ID assigned by reviewhook.

platformReviewId string

Original review ID from the source platform.

platform ReviewPlatform

Source platform enum. app_store · google_play · g2 · google_business · trustpilot · yelp.

rating number

Star rating on a 1–5 scale, normalized across platforms.

title string ?

Review headline. Omitted where the platform has no title field.

text string

Full review body, UTF-8.

authorId string ?

Platform-specific author identifier. Omitted when anonymous.

authorName string ?

Display name as shown on the platform. Omitted when anonymous.

productId string ?

Product identifier on the source platform.

productName string

Product or listing name at time of review.

appVersion string ?

App build the reviewer was on (mobile stores only).

deviceInfo DeviceInfo ?

Device metadata for mobile-store reviews.

createdAt ISO-8601

When the review was posted on the source platform.

updatedAt ISO-8601

Last modification — edits, translations, or response changes.

hasResponse boolean

True when the brand has replied to this review.

responseStatus string ?

Upstream delivery state of the reply — queued · sent · failed.

response ReviewResponse ?

Nested response object. Present only when hasResponse is true.

Referenced objects
ReviewResponse 4 fields
text string

Reply body as posted to the platform.

authorId string

Identifier of the team member who replied.

authorName string

Display name attached to the reply.

createdAt ISO-8601

When the reply was posted upstream.

DeviceInfo 1 field
osVersion string

Operating-system version string reported by the source, e.g. iOS 17.4 or Android 14.

Platform

POST /platform Private key

Connect a new source platform to your workspace. The returned ID is used when syncing.

Parameters

No parameters.

Request body
application/json
{
  "type": "g2",
  "handle": "reviewhook-dev",
  "credentials": { "token": "…" }
}
Responses
201 Platform connection created.
400 Invalid type or missing credentials.
Example response
application/json
{
  "id": "plat_9c2f41a0-7bce-4e90-a12d-3f7d9e8f1c4b",
  "type": "g2",
  "handle": "reviewhook-dev",
  "status": "connected",
  "lastSyncedAt": null,
  "createdAt": "2026-04-23T10:15:02Z"
}
Response schema 6 fields
Root object 6 fields
id string

Connection ID. Use this in sync calls.

type ReviewPlatform

Platform type. Matches the ReviewPlatform enum.

handle string

Identifier on the source platform — slug, app id, or profile.

status enum

connected · pending · error. Error implies bad creds or revoked access.

lastSyncedAt ISO-8601 | null

Null until the first sync completes.

createdAt ISO-8601

When the connection was created.