# App Store Reviews API (app_store.reviews)

- Canonical page: https://everyinfra.com/en/app-store-api/reviews
- Endpoint: POST https://api.everyinfra.com/api/v1/social with {"platform": "app_store", "action": "reviews", "params": {...}}
- Price: $0.001389 per call ($1.39 per 1,000 requests); failed calls and empty results are not charged
- Returns: list, default 30, max 500 per call
- Mode: sync; add "mode": "async" for slow tasks

## Health

- Live health (24h percent, hourly and daily trends): https://api.everyinfra.com/api/v1/social/availability?platform=app_store&action=reviews

## Parameters

| name | type | required | default | description |
|---|---|---|---|---|
| app_id | not declared | yes | not declared | Specifies Apple's numeric app identifier, such as the digits after id in an application link. You can also pass a full App Store app URL, and the platform will extract the numeric ID. Do not pass a Bundle ID in com.example.app format. |
| country | not declared | no | not declared | Selects the App Store storefront for search, profile, and reviews using a lowercase two-letter country code such as us, cn, or jp. The default is us. It changes the storefront being queried, not the account region or EveryInfra billing. |
| sort | enum: most_helpful / newest | no | not declared | Specifies the App Store review display order, accepting newest for recent reviews or most_helpful for top reviews. The reviews action defaults to newest when omitted. This parameter does not filter app search ranks or star ratings, and search or profile requests should not rely on it to modify results. |
| limit | integer (1–500) | no | 30 | The most rows to return in this call, an integer from 1 to 500. The default applies when you leave it out, and a call can return fewer rows. Larger values return 422 before any charge. |

## Response fields (items in `results`)

| field | meaning |
|---|---|
| id | The record's unique ID on the platform. Unique only within one platform; IDs can repeat across platforms. |
| title | Title. null when the platform has no titles (for example text-only posts). |
| text | Body text with HTML removed, returned in full and never cut short (on a few platforms the list results themselves carry only an excerpt; the platform's field notes say so). |
| rating | Rating. **The scale varies by platform**: rating_scale on the same row gives the maximum (usually 5; Booking, Douban, iQIYI and NAVER use 10). Convert with rating_scale before comparing across platforms, or the comparison can come out backwards. |
| rating_scale | Maximum of rating in the same row: 5 for five-star scales, 10 for ten-point scales. Present only when the row has a rating. |
| author | platform-native meaning |
| app_version | platform-native meaning |
| helpful_count | platform-native meaning |
| posted_at | Publish time in ISO 8601, UTC (for example 2026-08-07T12:34:56+00:00). Non-standard strings from the platform are passed through as is, so parse defensively. null means the platform does not disclose it. |
| app_id | platform-native meaning |
| app_name | platform-native meaning |
| platform | Source platform identifier, the same as platform in the request (for example xiaohongshu, tiktok). |

## Example

```bash
curl -X POST 'https://api.everyinfra.com/api/v1/social' \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "platform": "app_store",
  "action": "reviews",
  "params": {
    "app_id": "389801252"
  }
}'
```

```python
import os
import requests

response = requests.post(
    "https://api.everyinfra.com/api/v1/social",
    headers={"Authorization": f"Bearer {os.environ['EVERYINFRA_API_KEY']}"},
    json={
        "platform": "app_store",
        "action": "reviews",
        "params": {
            "app_id": "389801252",
        },
    },
    timeout=120,
)
print(response.status_code)
print(response.json())
```

## Response example

Real response to the example request above, captured 2026-09-26T08:56:04Z. `results` and `count` are real with personal information (names, handles, avatars, profile links, contact details) removed; the list keeps the first 2 of 10. `id`, `billing` and `quota` differ on every call, so only their shape is shown.

```text
{
  "id": "req_…",
  "platform": "app_store",
  "action": "reviews",
  "results": [
    {
      "id": "•••",
      "title": "Questionable security and no human being to talk to about it!",
      "text": "I wouldn’t be writing this review, if I had been capable of talking to actual person! In the middle of the night, while I was asleep, someone succeeded at hacking into one of my Instagram accounts…after only two failed attempts! At the time of the first two attempts, which, again…",
      "rating": 5,
      "author": "•••",
      "helpful_count": 0,
      "posted_at": "2025-12-21T18:38:52+00:00",
      "app_id": 389801252,
      "app_name": "Instagram",
      "platform": "app_store",
      "rating_scale": 5
    },
    {
      "id": "•••",
      "title": "Creative and User-Enhancing Suggestions",
      "text": "Dear Instagram Developers, I hope this message finds you well. I am writing to offer a few suggestions that I believe would greatly benefit and enhance the functionality of Instagram. Firstly, I propose the inclusion of a feature that would allow users to add music to their profi…",
      "rating": 5,
      "author": "•••",
      "helpful_count": 0,
      "posted_at": "2024-07-01T07:45:47+00:00",
      "app_id": 389801252,
      "app_name": "Instagram",
      "platform": "app_store",
      "rating_scale": 5
    }
  ],
  "count": 10,
  "billing": {
    "charged": …,
    "charged_usd": …,
    "balance_after_usd": …,
    …
  },
  "quota": { … }
}
```

## Also

- Capability catalog (no key): https://api.everyinfra.com/api/v1/social/catalog?platform=app_store
- OpenAPI: https://everyinfra.com/openapi.json · Agents guide: https://everyinfra.com/agents.md
