---
title: "Fetch app reviews"
method: GET
path: "/api/v1/apps/reviews"
tags: ["Apps"]
---

# Fetch app reviews

`GET /api/v1/apps/reviews`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/apps/reviews`
- Auth: HTTP bearer

Android defaults to merged market-language, English, Spanish, French, and Arabic feeds, deduplicated and sorted before limiting. Coverage is bounded, not exhaustive. Use lang for another specific feed.

## Query parameters

- `store` 'ios' | 'android', required
- `lang` string
- `id` string, required
- `country` string
- `sort` 'recent' | 'helpful'
- `min_rating` integer
- `max_rating` integer
- `limit` integer

## Response `200`

App reviews. When the store is throttling, Sonar's stored reviews for the storefront with `meta.stale` (rating filters and limit still apply; not for single-`lang` Android requests).

- object
  - `data` object[], required
    - `id` string
    - `userName` string
    - `score` integer
    - `title` string, nullable
    - `text` string
    - `date` string, nullable
    - `version` string, nullable
    - `url` string, nullable
    - `thumbsUp` integer, nullable
  - `meta` StaleMeta: Envelope `meta`, present only when the store was throttling and the endpoint answered from Sonar's stored copy instead of failing (apps/lookup, apps/search, apps/reviews, keywords/suggestions). Live answers carry no `meta`. A stored copy is billed like any 200.
    - `stale` true, required
    - `stale_as_of` string, nullable, required: When the stored copy was captured: ISO 8601 timestamp or YYYY-MM-DD date; null when unknown.
    - `partial` boolean, required: The copy holds less than a live call would: fewer results or fields (stored search results stop at the top 10, name/developer/icon only), or a different order (stored suggestions are ranked by popularity).
    - `stale_country` string, nullable: App lookup only: the storefront the stored copy came from, when it differs from the request.
    - `retry_after_seconds` integer, required: When live data is expected again.
    - `note` string, required: One sentence explaining what was served — safe to show to a user.

## Other responses

- `400`: Missing or invalid request parameters
- `401`: Missing or invalid API key
- `429`: Rate limited — see `error.reason`: daily_limit (Indie plan: 1,000 requests/day, resets 00:00 UTC; see `reset_at`), anonymous_daily_limit / batch_too_large (keyless free tier), store_rate_limited or concurrency_limit (transient, honor `retry_after_seconds`)
- `500`: Unexpected server error

---

[API](https://skmtc.dev/trysonar/apis/sonar-api.md) · [All operations](https://skmtc.dev/trysonar/apis/sonar-api/llms.txt) · [OpenAPI document](https://skmtc.dev/trysonar/apis/sonar-api/revisions/73fe8bc46522?raw)
