# List a Google Play product's reviews

Returns a Google Play product's reviews, with rating, text, author and date, a page at a time. Use it to track what users say about an app.

Tool `google-play.reviews` on Google Play. Contract version 1, released 2026-10-27.

## Example call

Over REST, send the input in the body. Over MCP, pass the same input to `call_tool`.

cURL:

```bash
curl https://api.voxoria.ai/v1/tools/google-play.reviews/calls \
  -H "Authorization: Bearer $VOXORIA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input":{"product_id":"com.duolingo","sort":"newest"}}'
```

Python:

```python
import os

import httpx

response = httpx.post(
    "https://api.voxoria.ai/v1/tools/google-play.reviews/calls",
    headers={"Authorization": f"Bearer {os.environ['VOXORIA_API_KEY']}"},
    json={"input": {"product_id": "com.duolingo", "sort": "newest"}},
    timeout=60,
)
print(response.json())
```

TypeScript:

```ts
const response = await fetch("https://api.voxoria.ai/v1/tools/google-play.reviews/calls", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.VOXORIA_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({"input": {"product_id": "com.duolingo", "sort": "newest"}}),
});
console.log(await response.json());
```

MCP (`tools/call` params):

```json
{
  "name": "call_tool",
  "arguments": {
    "tool": "google-play.reviews",
    "input": {
      "product_id": "com.duolingo",
      "sort": "newest"
    }
  }
}
```

Both return [the full response](/docs/call-response.md): the call's ID, status and cost, with this tool's result in `output`.

## Input

| Input | Type | Required | Default | Description |
| --- | --- | --- | --- | --- |
| `product_id` | string | Yes |  | Google Play's ID of the product, such as an app's package name "com.duolingo". The product_id of a google-play.search result. 1 to 512 characters. Matches `^[A-Za-z0-9._-]+$`. |
| `product_type` | string | No | `app` | Section of Google Play the product is in. One of `app`, `book`, `audiobook`, `movie`, `tv_show`. |
| `sort` | string | No |  | Order of the reviews. Google Play's own order is relevance. One of `relevance`, `newest`. |
| `rating` | integer | No |  | Keeps only the reviews that gave exactly this many stars. From 1 to 5. |
| `country` | string | No | `us` | Two-letter ISO 3166-1 country code of the storefront. Case-insensitive. One of the 249 values of the `countries` list: ISO 3166-1 alpha-2 country codes, lowercase. |
| `language` | string | No | `en` | Two-letter ISO 639-1 language code. Google Play returns the reviews written in it. Case-insensitive. One of the 184 values of the `languages` list: ISO 639-1 two-letter language codes, lowercase. |
| `next_page_token` | string | No |  | Fetches the next page. Take it from pagination.next_page_token of the previous page, and send the same product, sort, rating, country and language. |

## Output

A successful call returns these blocks in its `output`. A field not marked required can be `null`.

### reviews

A list of rows. Always present, possibly empty.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `review_id` | string | No | Google Play's identifier of the review. |
| `rating` | number | Yes | Stars the reviewer gave, from 1 to 5. |
| `text` | string | No | What the reviewer wrote. |
| `author_name` | string | No |  |
| `author_image_url` | string | No | Address of the reviewer's profile picture. |
| `published_at` | string | No | When the review was written, in ISO 8601. |
| `likes` | integer | No | Number of people who marked the review helpful. |
| `app_version` | string | No | Version of the app the review is of, such as "6.75.7". |

### pagination

One object. Can be `null`. How to fetch the next page. Null on the last page.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `next_page_token` | string | Yes | Send as next_page_token to fetch the next page. |

## Example output

The `output` of a real call, each list cut to 3 items.

```json
{
  "reviews": [
    {
      "review_id": "ca996495-4ed1-487b-b561-d285d745b87c",
      "rating": 5,
      "text": "I think it is very fantastic😊",
      "author_name": "MONALI PATIL",
      "author_image_url": "https://play-lh.googleusercontent.com/a/ACg8ocLV6ASWMi8FRes853GhtukU19T7Cxyeam7QywrGByFZVlwPuw=mo",
      "published_at": "2026-10-27T04:18:20Z",
      "likes": 0,
      "app_version": "6.102.4"
    },
    {
      "review_id": "1e9127d3-6312-450e-9d99-4e61598eeea0",
      "rating": 5,
      "text": "best app for learning english",
      "author_name": "hospicall system",
      "author_image_url": "https://play-lh.googleusercontent.com/a-/ALV-UjUb8aANebgC9RgkSMPOaZFQgV-hEMk8uSibk_6R2nnogEb-tLU",
      "published_at": "2026-10-27T04:17:05Z",
      "likes": 0,
      "app_version": "6.102.4"
    },
    {
      "review_id": "f1d912d7-4137-43dc-b8e6-261de372d391",
      "rating": 1,
      "text": "good for leaning languages but bad for learning how to speak. now with add charges.. such a good app gone bad... rip duo.... you started so good but ended so bad... strongly pushing for in app purchases for gems.. they raised the usage for a streak freeze from 250 to 650 gems! I saved up for over a year and it cost 1,300 gems for 2 streak freezes....",
      "author_name": "xander goff",
      "author_image_url": "https://play-lh.googleusercontent.com/a/ACg8ocJ5Y76UGXdYZE4u1lgXb2K1STngrwKx0C2THf90XJoa2LDs9g=mo",
      "published_at": "2026-10-27T04:16:37Z",
      "likes": 2,
      "app_version": null
    }
  ],
  "pagination": {
    "next_page_token": "pt1.bGl0ZXNjcmFwZTpleUoySWpveExDSnZjR1Z5WVhScGIyNGlPaUp5WlhacFpYZHpJaXdpWTI5dWRHVjRkQ0k2ZXlKb2JDSTZJbVZ1SWl3aVoyd2lPaUoxY3lJc0luQnliMlIxWTNSZmFXUWlPaUpqYjIwdVpIVnZiR2x1WjI4aUxDSnpkRzl5WlNJNkltRndjSE1pTENKd2JHRjBabTl5YlNJNkluQm9iMjVsSWl3aWMyOXlkRjlpZVNJNk1pd2liblZ0SWpvME1IMHNJbXRwYm1RaU9pSnlaWFpwWlhkeklpd2lkRzlyWlc0aU9pSkRjMWxDU1hJd1FrRlNjVWwxYldoT1pHSlRRME5CWXpoRWRDMUJTV1JIWTJKSlpDMDBXQzFxU0RsTGFVcHZiRGRNZWtzME5GSnJkM3BZVm1KM1NqaG9RbHBoUTA4M2JIWkxSRlIzVlUxT1YzSjZUM1J6V1ZKMGJtbDZSRVJYWDJreFgydHBSM0pSY1RSaldXNUdhMDl4TmxobE1uSk9RVlpNTURGdVEzTkJkMUZ2T0d4MFkxaHdWVVF6YUZkdVJHZHhXVGRSTlV0TE1GQjBhRkZNV1ZsRk0ybGxUbU5wZDFKYVgwSjVNbEpZU0dwME1qSnNWemxDUlVsSU5XTXRjVU5hU0hJMFZsSlhUMEo1U0dWalNtSjBNbE5qVWtoeVRVdHhlamxyUW5wMGNXaGhia3BUYVhsYWRYcEphMEl6Tm5sWlJURkVVWFkxY25KMlUzSm1VRzAyUVZwV1prdFBSSGRvWkdOSEluMA"
  }
}
```
