TidyTools

App Store reviews

POST https://tools.yukai.uk/api/v1/appstore/reviews

Get App Store reviews of an app. Reads Apple's customer-reviews feed (the newest 500 written reviews per country, 50 per page) with retries for Apple's empty and rate-limited pages, then sorts and filters.

Cost

Credits: 1 per review ($0.0001 per review). 50 credits are reserved before the call; the call is then settled on the real number of items returned. Failed calls are free. Source price: apple-app-store-reviews/review.

Input

Send a JSON body (POST) or the same fields as a query string (GET).

Required: app.

FieldTypeDefaultDescription
app requiredstringApp Store URL (https://apps.apple.com/us/app/instagram/id389801252), numeric app id (389801252), bundle id (com.burbn.instagram) or an app name to search. Aliases: id, appId, url, bundleId.
countrystring"us"Two-letter App Store country (storefront). Default: the country in the App Store URL, else us.
sortstring"mostRecent"Order of the reviews returned.
limitinteger100Maximum reviews returned.
minRatinginteger1Only reviews with at least this many stars.
maxRatinginteger5Only reviews with at most this many stars.
sincestringOnly reviews since a date (2026-09-01) or a period (30 days, 2 weeks).

Examples

Replace tt_live_XXXX with your key from the pricing page.

curl

curl -i -X POST "https://tools.yukai.uk/api/v1/appstore/reviews" \
  -H "Authorization: Bearer tt_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{"app":"389801252"}'

JavaScript (fetch)

const res = await fetch("https://tools.yukai.uk/api/v1/appstore/reviews", {
  method: "POST",
  headers: { "Authorization": "Bearer tt_live_XXXX", "Content-Type": "application/json" },
  body: JSON.stringify({"app":"389801252"}),
});
console.log(res.status, res.headers.get("x-credits-charged"), res.headers.get("x-credits-balance"));
console.log(await res.json());

Python (requests)

import requests

r = requests.post(
    "https://tools.yukai.uk/api/v1/appstore/reviews",
    headers={"Authorization": "Bearer tt_live_XXXX"},
    json={"app": "389801252"},
    timeout=120,
)
print(r.status_code, r.headers.get("x-credits-charged"), r.headers.get("x-credits-balance"))
print(r.json())

Response

JSON with "success": true and the result fields; on failure {"success": false, "error": {"code", "message", "retryable"}} and no credits are used. Every answer carries x-credits-charged (credits used) and x-credits-balance (balance after the call); check the balance any time with GET https://tools.yukai.uk/v1/billing/balance.

Full field list and response schema: OpenAPI spec app-store (its servers entry is the marketplace gateway; call https://tools.yukai.uk with your key).

← All routes · Pricing