API
Read reviews, ratings and keyword positions, and post replies and labels, from scripts, BI tools or automation platforms. Workspace owners create keys in Settings → API. A key can do anything a member of its workspace can, so keep it secret.
Authentication
Send the key as a bearer token. Each key can make 120 requests a minute; past that you get HTTP 429 with a Retry-After header.
curl https://apprate.io/api/v1/apps \ -H "Authorization: Bearer ar_…"
Endpoints
| Method | Path | What it does |
|---|---|---|
| GET | /api/v1/apps | Apps the workspace tracks. |
| GET | /api/v1/reviews | Reviews, newest first. Filters: app_id, since, until, rating (e.g. 1,2), replied (true|false), label. Paging: limit (max 200), cursor. |
| POST | /api/v1/reviews/:id/reply | Post or update the developer reply. Body: {"text": "…"}. Needs a connected developer account. |
| POST | /api/v1/reviews/:id/labels | Add a label. Body: {"label": "bug"}. |
| DELETE | /api/v1/reviews/:id/labels?label=bug | Remove a label. |
| GET | /api/v1/apps/:id/ratings?days=90 | Daily store rating and rating count, up to 365 days. |
| GET | /api/v1/apps/:id/keywords?days=30 | Tracked keywords with popularity, difficulty and daily positions, up to 90 days. |
Paging through reviews
Responses look like {"data": [...], "next_cursor": "…"}. Pass next_cursor back as cursor until it is null. Pages stay stable while new reviews arrive.
curl "https://apprate.io/api/v1/reviews?rating=1,2&replied=false&limit=100" \ -H "Authorization: Bearer ar_…"
Each review has id, app_id, store, country, rating, title, body, author, version, language, reviewed_at, sentiment, topics, flag, labels, reply, replied_at and can_reply. flag is spam, offensive, off_topic or personal_info when AI thinks the store would remove the review, else null.
Replying
curl -X POST https://apprate.io/api/v1/reviews/REVIEW_ID/reply \
-H "Authorization: Bearer ar_…" \
-H "Content-Type: application/json" \
-d '{"text": "Thanks! This is fixed in 4.2."}'Replies go out through the App Store Connect or Google Play account linked to the app. can_reply is false when the store doesn't accept a reply yet (Google Play only takes replies to reviews from the last 7 days).
Errors
Errors return {"error": {"status": 400, "message": "…"}}: 400 for a bad parameter, 401 for a missing or wrong key, 404 for something outside your workspace, 422 when a reply or label can't be saved, 429 for the rate limit and 502 when the store rejects a reply.